python多進程實現處理序間通訊執行個體,python執行個體
python中的多線程其實並不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。藉助這個包,可以輕鬆完成從單進程到並發執行的轉換。multiprocessing支援子進程、通訊和共用資料、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。
multiprocessing.Queue()
以Queue為例,在父進程中建立兩個子進程,一個往Queue裡寫資料,一個從Queue裡讀資料:
multiprcessing.Queue.put() 為 入隊操作
multiprcessing.Queue.get() 為 出隊操作
隊列 線程 和 進程 安全
put(obj[, block[, timeout]])
將obj放入隊列。 如果選擇性參數 block為True(預設值),timeout為None(預設值),則必要時阻止,直到空閑插槽可用。 如果逾時是正數,它將阻止最多逾時秒數,如果在該時間內沒有空閑插槽可用,則會引發Queue.Full異常。 否則(塊為False),如果空閑插槽立即可用,則將一個項目放在隊列中,否則會引發Queue.Full異常(在這種情況下,忽略逾時)。
get([block[, timeout]])
從隊列中刪除並返回一個項目。 如果可選的args塊為True(預設值),逾時為None(預設值),則在必要時阻止,直到項目可用。 如果逾時為正數,則它將阻塞至多逾時秒數,並在該時間內沒有可用項目時引發Queue.Empty異常。 否則(block為False),如果一個項目立即可用,返回一個項目,否則會引發Queue.Empty異常(在這種情況下,忽略逾時)。
#- * -coding: utf - 8 - * - from multiprocessingimport Process, Queueimport osimport timeimport random# 寫資料進程執行的代碼: 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()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()
輸出
Process to read: 5836Process to write: 6472Put A to queue...Put B to queue...Get A from queue.Put C to queue...Get B from queue.Get C from queue.Process finished with exit code 0
multiprocessing.Pipe()
Pipe()函數返回一對由管道串連的連線物件,預設情況下是雙工(雙向)。
Pipe()返回的兩個連線物件代表管道的兩端。 每個連線物件都有send()和recv()方法(等等)。 請注意,如果兩個進程(或線程)嘗試同時讀取或寫入管道的同一端,管道中的資料可能會損壞。 當然,同時使用管道不同端的過程也不會有風險。
返回表示管道末端的一對Connection(conn1,conn2)對象。
如果duplex為True(預設),則管道是雙向的。
如果duplex是False,那麼管道是單向的:conn1隻能用於接收訊息,conn2隻能用於發送訊息。
#- * -coding: utf - 8 - * - from multiprocessingimport Process, Pipedef f(conn): conn.send([42, None, 'hello'])while True: print(conn.recv())if __name__ == '__main__': parent_conn, child_conn = Pipe()p = Process(target = f, args = (child_conn, ))p.start()print parent_conn.recv()# prints "[42, None, 'hello']"parent_conn.send('666')p.terminate()
輸出:
[42, None, 'hello']666Process finished with exit code 0
總結
以上就是本文關於python多進程實現處理序間通訊執行個體的全部內容,希望對大家有所協助。感興趣的朋友可繼續參閱本站:
Python編程實現蟻群演算法詳解
python繪製鉛球的運行軌跡代碼分享
Python中turtle作圖樣本
如有不足之處,歡迎留言指出。