python多進程實現處理序間通訊執行個體,python執行個體

來源:互聯網
上載者:User

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作圖樣本

如有不足之處,歡迎留言指出。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.