標籤:python 線程queue.queue 進程multiprocess.queue
#!/usr/bin/env python# -*- coding:utf-8 -*-# author: Changhua Gongfrom multiprocessing import Process, Queueimport os, time, random‘‘‘1. 我們平時from queue import Queue是線程對列,用於資料共用的,只能線上程之間進行使用;2. from multiprocessing import Queue,是進程對列,用於進程間資料交換,實際中是在進程之間進行序列化和還原序列化(pickle) 完成資料互動的;3. 線程之間修改同一份資料,需加鎖,而進程間的資料傳遞,僅是傳遞(資料共用)。‘‘‘# 寫資料進程執行的代碼:def write(q): print(‘Process to write: %s‘ % os.getpid()) for value in [‘A‘, ‘B‘, ‘C‘]: print(‘Put %s to queue...‘ % value) q.put(value) # 推送 time.sleep(random.random())# 讀資料進程執行的代碼:def read(q): print(‘Process to read: %s‘ % os.getpid()) while True: value = q.get(True) # 擷取 print(‘Get %s from queue.‘ % value)if __name__==‘__main__‘: # 父進程建立Queue,並傳給各個子進程: q = Queue() pw = Process(target=write, args=(q,)) pr = Process(target=read, args=(q,)) # 啟動子進程pw,寫入: pw.start() # 啟動子進程pr,讀取: pr.start() # 等待pw結束: pw.join() # pr進程裡是死迴圈,無法等待其結束,只能強行終止: pr.terminate() #!/usr/bin/env python# -*- coding:utf-8 -*-# author: Changhua Gongfrom multiprocessing import Process, Pipefrom time import sleepfrom multiprocessing import freeze_support‘‘‘def Pipe(duplex=True): return Connection(), Connection()說明個問題:Pipe僅能兩個進程間的互動,類似電話線形式收發‘‘‘def run_A(conn): for i in range(3): conn.send("I am from run_A: %s" % i) sleep(0.3) for i in range(5): print(conn.recv())def run_B(conn): for i in range(3): print(conn.recv()) for i in range(5): conn.send("I am from run_B: %s" % i) sleep(0.3)if __name__ == "__main__": freeze_support() conn1, conn2 = Pipe() pA = Process(target=run_A, args=(conn1,)) pB = Process(target=run_B, args=(conn2,)) pA.start() pB.start() pA.join() pB.join()
本文出自 “90SirDB” 部落格,請務必保留此出處http://90sirdb.blog.51cto.com/8713279/1927751
Python 多進程 多線程資料共用