python多進程實現(xiàn)進程間通信實例
python中的多線程其實并不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數(shù),Python會完成其他所有事情。借助這個包,可以輕松完成從單進程到并發(fā)執(zhí)行的轉(zhuǎn)換。multiprocessing支持子進程、通信和共享數(shù)據(jù)、執(zhí)行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。
multiprocessing.Queue()
以Queue為例,在父進程中創(chuàng)建兩個子進程,一個往Queue里寫數(shù)據(jù),一個從Queue里讀數(shù)據(jù):
multiprcessing.Queue.put() 為 入隊操作
multiprcessing.Queue.get() 為 出隊操作
隊列 線程 和 進程 安全
put(obj[, block[, timeout]])
將obj放入隊列。 如果可選參數(shù) block為True(默認值),timeout為None(默認值),則必要時阻止,直到空閑插槽可用。 如果超時是正數(shù),它將阻止最多超時秒數(shù),如果在該時間內(nèi)沒有空閑插槽可用,則會引發(fā)Queue.Full異常。 否則(塊為False),如果空閑插槽立即可用,則將一個項目放在隊列中,否則會引發(fā)Queue.Full異常(在這種情況下,忽略超時)。
get([block[, timeout]])
從隊列中刪除并返回一個項目。 如果可選的args塊為True(默認值),超時為None(默認值),則在必要時阻止,直到項目可用。 如果超時為正數(shù),則它將阻塞至多超時秒數(shù),并在該時間內(nèi)沒有可用項目時引發(fā)Queue.Empty異常。 否則(block為False),如果一個項目立即可用,返回一個項目,否則會引發(fā)Queue.Empty異常(在這種情況下,忽略超時)。
#- * -coding: utf - 8 - * - from multiprocessing import Process, Queue import os import time import random # 寫數(shù)據(jù)進程執(zhí)行的代碼: 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()) # 讀數(shù)據(jù)進程執(zhí)行的代碼: def read(q): print('Process to read: %s' % os.getpid()) while True: value = q.get() print('Get %s from queue.' % value) if __name__ == '__main__': #父進程創(chuàng)建Queue, 并傳給各個子進程: q = Queue() pw = Process(target = write, args = (q, )) pr = Process(target = read, args = (q, ))# 啟動子進程pw, 寫入: pw.start()# 啟動子進程pr, 讀取: pr.start()# 等待pw結(jié)束: pw.join()# pr進程里是死循環(huán), 無法等待其結(jié)束, 只能強行終止: pr.terminate()
輸出
Process to read: 5836 Process to write: 6472 Put 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()函數(shù)返回一對由管道連接的連接對象,默認情況下是雙工(雙向)。
Pipe()返回的兩個連接對象代表管道的兩端。 每個連接對象都有send()和recv()方法(等等)。 請注意,如果兩個進程(或線程)嘗試同時讀取或?qū)懭牍艿赖耐欢?,管道中的?shù)據(jù)可能會損壞。 當(dāng)然,同時使用管道不同端的過程也不會有風(fēng)險。
返回表示管道末端的一對Connection(conn1,conn2)對象。
如果duplex為True(默認),則管道是雙向的。
如果duplex是False,那么管道是單向的:conn1只能用于接收消息,conn2只能用于發(fā)送消息。
#- * -coding: utf - 8 - * - from multiprocessing import Process, Pipe def 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'] 666 Process finished with exit code 0
總結(jié)
以上就是本文關(guān)于python多進程實現(xiàn)進程間通信實例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可繼續(xù)參閱本站:
如有不足之處,歡迎留言指出。
相關(guān)文章
Python開發(fā)如何在ubuntu 15.10 上配置vim
這篇文章主要介紹了Python開發(fā)如何在ubuntu 15.10 上配置vim 的相關(guān)資料,需要的朋友可以參考下2016-01-01PyCharm中New Directory 和 New Python
python package這是一個特殊的目錄,因為在創(chuàng)建該python package的時候,系統(tǒng)會自動地生成一個py文件, init.py,這篇文章主要介紹了PyCharm中New Directory 和 New Python Package的區(qū)別,需要的朋友可以參考下2023-12-12