成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python 學(xué)習(xí)筆記 - Queue & Pipes,進程間通訊

xiaodao / 3296人閱讀

摘要:的讀寫效率要高于。進程間的基于機制建立。當(dāng)主進程創(chuàng)建子進程后,也被拷貝了一份。此后,關(guān)閉主進程的一個,關(guān)閉一個子進程的一個。據(jù)官方文檔也是基于的實現(xiàn)。

上面寫了Python如何創(chuàng)建多個進程,但是前面文章中創(chuàng)建的進程都是啞巴和聾子,自己顧自己執(zhí)行,不會相互交流。
那么如何讓進程間相互說說話呢?
Python為我們提供了一個函數(shù)multiprocessing.Pipe
和一個類:multiprocessing.Queue。

multiprocessing.Pipe()

multiprocessing.Pipe()即管道模式,調(diào)用Pipe()返回管道的兩端的Connection。

Python官方文檔的描述:
Returns a pair (conn1, conn2) of Connection objects representing the ends of a pipe.

因此, Pipe僅僅適用于只有兩個進程一讀一寫的單雙工情況,也就是說信息是只向一個方向流動。例如電視、廣播,看電視的人只能看,電視臺是能播送電視節(jié)目。

Pipe的讀寫效率要高于Queue。
進程間的Pipe基于fork機制建立。
當(dāng)主進程創(chuàng)建Pipe的時候,Pipe的兩個Connections連接的的都是主進程。
當(dāng)主進程創(chuàng)建子進程后,Connections也被拷貝了一份。此時有了4個Connections。
此后,關(guān)閉主進程的一個Out Connection,關(guān)閉一個子進程的一個In Connection。那么就建立好了一個輸入在主進程,輸出在子進程的管道。
原理示意圖如下:

跟多資料可以閱讀:http://www.tuicool.com/articl...

# 示例代碼
# coding=utf-8
from multiprocessing import Pipe, Process


def son_process(x, pipe):
    _out_pipe, _in_pipe = pipe

    # 關(guān)閉fork過來的輸入端
    _in_pipe.close()
    while True:
        try:
            msg = _out_pipe.recv()
            print msg
        except EOFError:
            # 當(dāng)out_pipe接受不到輸出的時候且輸入被關(guān)閉的時候,會拋出EORFError,可以捕獲并且退出子進程
            break


if __name__ == "__main__":
    out_pipe, in_pipe = Pipe(True)
    son_p = Process(target=son_process, args=(100, (out_pipe, in_pipe)))
    son_p.start()

    # 等pipe被fork 后,關(guān)閉主進程的輸出端
    # 這樣,創(chuàng)建的Pipe一端連接著主進程的輸入,一端連接著子進程的輸出口
    out_pipe.close()
    for x in range(1000):
        in_pipe.send(x)
    in_pipe.close()
    son_p.join()
    print "主進程也結(jié)束了"

總結(jié)一下:

上面的代碼中主要用到了pipe的send()、recv()、close()方法。當(dāng)pipe的輸入端被關(guān)閉,且無法接收到輸入的值,那么就會拋出EOFError。

新建一個Pipe(duplex)的時候,如果duplex為True,那么創(chuàng)建的管道是雙向的;如果duplex為False,那么創(chuàng)建的管道是單向的。

multiprocessing.Queue

Queue據(jù)官方文檔也是基于pipe的實現(xiàn)。
Queue的使用主要是一邊put(),一邊get().但是Queue可以是多個Process 進行put操作,也可以是多個Process進行g(shù)et()操作。
Demo:

# coding=utf-8
from multiprocessing import Queue, Process
from Queue import Empty as QueueEmpty
import random


def getter(name, queue):
    print "Son process %s" % name
    while True:
        try:
            value = queue.get(True, 10)
            # block為True,就是如果隊列中無數(shù)據(jù)了。
            #   |—————— 若timeout默認(rèn)是None,那么會一直等待下去。
            #   |—————— 若timeout設(shè)置了時間,那么會等待timeout秒后才會拋出Queue.Empty異常
            # block 為False,如果隊列中無數(shù)據(jù),就拋出Queue.Empty異常
            print "Process getter get: %f" % value
        except QueueEmpty:
            break


def putter(name, queue):
    print "Son process %s" % name
    for i in range(0, 1000):
        value = random.random()
        queue.put(value)
        # 放入數(shù)據(jù) put(obj[, block[, timeout]])
        # 若block為True,如隊列是滿的:
        #  |—————— 若timeout是默認(rèn)None,那么就會一直等下去
        #  |—————— 若timeout設(shè)置了等待時間,那么會等待timeout秒后,如果還是滿的,那么就拋出Queue.Full.
        # 若block是False,如果隊列滿了,直接拋出Queue.Full
        print "Process putter put: %f" % value


if __name__ == "__main__":
    queue = Queue()
    getter_process = Process(target=getter, args=("Getter", queue))
    putter_process = Process(target=putter, args=("Putter", queue))
    getter_process.start()
    putter_process.start()

Queue的一些說明已經(jīng)寫在代碼中了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38359.html

相關(guān)文章

  • python3 queue多線程通信

      小編寫這篇文章的主要目的,主要是給大家介紹關(guān)于python3 queue多線程通信,這里面有很多的技術(shù)性的難點,那么,該怎么去進行處理呢,下面小編給大家進行詳細(xì)的解答一下?! ueue分類  python3 queue分三類:  先進先出隊列  后進先出的?! ?yōu)先級隊列  他們的導(dǎo)入方式分別是: fromqueueimportQueue   fromqueueimportLifoQueue...

    89542767 評論0 收藏0
  • python中簡單好用的進程數(shù)據(jù)通訊模塊multiprocessing.Manager

    摘要:目前開發(fā)中有遇到進程間需要共享數(shù)據(jù)的情況所以研究了下主要會以為例子說明下進程間共享同一個父進程使用說明創(chuàng)建一個對象創(chuàng)建一個創(chuàng)建一個測試程序創(chuàng)建進程池進行測試簡單的源碼分析這時我們再看一個例子創(chuàng)建一個對象創(chuàng)建一個創(chuàng)建一個測試程序創(chuàng)建進程池進行 目前開發(fā)中有遇到進程間需要共享數(shù)據(jù)的情況. 所以研究了下multiprocessing.Manager, 主要會以dict為例子, 說明下進程間共...

    jeyhan 評論0 收藏0
  • Python實現(xiàn)配置熱加載的方法

      小編寫這篇文章的目的,主要是給大家講解一下,關(guān)于實現(xiàn)配置熱加載的方法,具體是怎么操作呢?下面就給大家詳細(xì)的解答下?! ”尘啊 ∮捎谧罱邢嚓P(guān)的工作需求,需要進行增添相關(guān)的新功能,實現(xiàn)配置熱加載的功能。所謂的配置熱加載,也就是說當(dāng)服務(wù)收到配置更新消息之后,我們不用重啟服務(wù)就可以使用最新的配置去執(zhí)行任務(wù)?! ∪绾螌崿F(xiàn)  下面我分別采用多進程、多線程、協(xié)程的方式去實現(xiàn)配置熱加載?! ∈褂枚噙M程實現(xiàn)配...

    89542767 評論0 收藏0

發(fā)表評論

0條評論

xiaodao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<