摘要:的讀寫效率要高于。進程間的基于機制建立。當(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()即管道模式,調(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.QueueQueue據(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多線程通信,這里面有很多的技術(shù)性的難點,那么,該怎么去進行處理呢,下面小編給大家進行詳細(xì)的解答一下?! ueue分類 python3 queue分三類: 先進先出隊列 后進先出的?! ?yōu)先級隊列 他們的導(dǎo)入方式分別是: fromqueueimportQueue fromqueueimportLifoQueue...
摘要:目前開發(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為例子, 說明下進程間共...
小編寫這篇文章的目的,主要是給大家講解一下,關(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)配...
閱讀 3106·2021-08-03 14:05
閱讀 2152·2019-08-29 15:35
閱讀 688·2019-08-29 13:30
閱讀 3176·2019-08-29 13:20
閱讀 2541·2019-08-23 18:15
閱讀 1807·2019-08-23 14:57
閱讀 2224·2019-08-23 13:57
閱讀 1320·2019-08-23 12:10