您好,登錄后才能下訂單哦!
本篇文章為大家展示了Python通過隊列來實現(xiàn)進程間通信,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Python程序中,在進程和進程之間是不共享全局變量的數(shù)據(jù)的。
我們來看一個例子:
from multiprocessing import Process import os import time nums = [11, 22] def work1(): """子進程要執(zhí)行的代碼""" print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) for i in range(3): nums.append(i) time.sleep(1) print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) def work2(): """子進程要執(zhí)行的代碼""" print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums)) if __name__ == '__main__': p1 = Process(target=work1) p1.start() p1.join() p2 = Process(target=work2) p2.start()
進程 p1 里對全局變量 nums 循環(huán)進行處理,進程 p2 將 nums 打印出來,發(fā)現(xiàn) nums 的值沒有變化。
運行結(jié)果:
in process1 pid=5788 ,nums=[11, 22]
in process1 pid=5788 ,nums=[11, 22, 0]
in process1 pid=5788 ,nums=[11, 22, 0, 1]
in process1 pid=5788 ,nums=[11, 22, 0, 1, 2]
in process2 pid=11832 ,nums=[11, 22]
通過隊列完成進程間通信
但是進程(Process)之間有時需要通信,操作系統(tǒng)提供了很多機制來實現(xiàn)進程間的通信。
可以使用 multiprocessing 模塊的 Queue 實現(xiàn)多進程之間的數(shù)據(jù)傳遞。
Queue 本身是一個消息隊列程序,首先用一個小實例來演示一下 Queue 的工作原理:
from multiprocessing import Queue # 初始化一個Queue對象,最多可接收三條put消息 q = Queue(3) q.put("消息1") q.put("消息2") print(q.full()) # False q.put("消息3") print(q.full()) # True # 因為消息隊列已滿下面的try都會拋出異常 # 第一個try會等待2秒后再拋出異常 try: q.put("消息4", True, 2) except: print("消息隊列已滿,現(xiàn)有消息數(shù)量:%s" % q.qsize()) # 第二個Try會立刻拋出異常 try: q.put_nowait("消息4") except: print("消息列隊已滿,現(xiàn)有消息數(shù)量:%s" % q.qsize()) # 推薦的方式,先判斷消息列隊是否已滿,再寫入 if not q.full(): q.put_nowait("消息4") # 讀取消息時,先判斷消息列隊是否為空,再讀取 if not q.empty(): for i in range(q.qsize()): print(q.get_nowait())
運行結(jié)果:
隊列 Queue 的使用說明
初始化 Queue()對象時(例如:q=Queue()),若括號中沒有指定最大可接收的消息數(shù)量,或數(shù)量為負值,那么就代表可接受的消息數(shù)量沒有上限(直到內(nèi)存的盡頭)。
Queue.qsize():返回當前隊列包含的消息數(shù)量。
Queue.empty():如果隊列為空,返回True,反之False。
Queue.full():如果隊列滿了,返回True,反之False。
Queue.get([block[, timeout]]):獲取隊列中的一條消息,然后將其從列隊中移除,block 默認值為 True。
Queue.get_nowait():相當 Queue.get(False)。
Queue.put(item,[block[, timeout]]):將 item 消息寫入隊列,block 默認值為 True。
Queue.put_nowait(item):相當Queue.put(item, False)。
Queue實例
我們以 Queue 為例,在父進程中創(chuàng)建兩個子進程,一個往 Queue 里寫數(shù)據(jù),一個從 Queue 里讀數(shù)據(jù)。
from multiprocessing import Process, Queue import os import time import random def write(q): # 寫數(shù)據(jù)進程執(zhí)行的代碼: for value in ['A', 'B', 'C']: print('Put %s to queue...' % value) q.put(value) time.sleep(random.random()) def read(q): # 讀數(shù)據(jù)進程執(zhí)行的代碼: while True: if not q.empty(): value = q.get(True) print('Get %s from queue.' % value) time.sleep(random.random()) else: break if __name__ == '__main__': # 父進程創(chuàng)建Queue,并傳給各個子進程: q = Queue() pw = Process(target=write, args=(q,)) pr = Process(target=read, args=(q,)) # 啟動子進程pw,寫入: pw.start() # 等待pw結(jié)束: pw.join() # 啟動子進程pr,讀取: pr.start() pr.join() print('') print('所有數(shù)據(jù)都寫入并且讀完')
運行結(jié)果:
上述內(nèi)容就是Python通過隊列來實現(xiàn)進程間通信,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。