python多進(jìn)程實(shí)現(xiàn)進(jìn)程間通信實(shí)例
python中的多線(xiàn)程其實(shí)并不是真正的多線(xiàn)程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進(jìn)程。Python提供了非常好用的多進(jìn)程包multiprocessing,只需要定義一個(gè)函數(shù),Python會(huì)完成其他所有事情。借助這個(gè)包,可以輕松完成從單進(jìn)程到并發(fā)執(zhí)行的轉(zhuǎn)換。multiprocessing支持子進(jìn)程、通信和共享數(shù)據(jù)、執(zhí)行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。
multiprocessing.Queue()
以Queue為例,在父進(jìn)程中創(chuàng)建兩個(gè)子進(jìn)程,一個(gè)往Queue里寫(xiě)數(shù)據(jù),一個(gè)從Queue里讀數(shù)據(jù):
multiprcessing.Queue.put() 為 入隊(duì)操作
multiprcessing.Queue.get() 為 出隊(duì)操作
隊(duì)列 線(xiàn)程 和 進(jìn)程 安全
put(obj[, block[, timeout]])
將obj放入隊(duì)列。 如果可選參數(shù) block為T(mén)rue(默認(rèn)值),timeout為None(默認(rèn)值),則必要時(shí)阻止,直到空閑插槽可用。 如果超時(shí)是正數(shù),它將阻止最多超時(shí)秒數(shù),如果在該時(shí)間內(nèi)沒(méi)有空閑插槽可用,則會(huì)引發(fā)Queue.Full異常。 否則(塊為False),如果空閑插槽立即可用,則將一個(gè)項(xiàng)目放在隊(duì)列中,否則會(huì)引發(fā)Queue.Full異常(在這種情況下,忽略超時(shí))。
get([block[, timeout]])
從隊(duì)列中刪除并返回一個(gè)項(xiàng)目。 如果可選的args塊為T(mén)rue(默認(rèn)值),超時(shí)為None(默認(rèn)值),則在必要時(shí)阻止,直到項(xiàng)目可用。 如果超時(shí)為正數(shù),則它將阻塞至多超時(shí)秒數(shù),并在該時(shí)間內(nèi)沒(méi)有可用項(xiàng)目時(shí)引發(fā)Queue.Empty異常。 否則(block為False),如果一個(gè)項(xiàng)目立即可用,返回一個(gè)項(xiàng)目,否則會(huì)引發(fā)Queue.Empty異常(在這種情況下,忽略超時(shí))。
#- * -coding: utf - 8 - * -
from multiprocessing
import Process, Queue
import os
import time
import random
# 寫(xiě)數(shù)據(jù)進(jìn)程執(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ù)進(jìn)程執(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__': #父進(jìn)程創(chuàng)建Queue, 并傳給各個(gè)子進(jìn)程:
q = Queue()
pw = Process(target = write, args = (q, ))
pr = Process(target = read, args = (q, ))# 啟動(dòng)子進(jìn)程pw, 寫(xiě)入:
pw.start()# 啟動(dòng)子進(jìn)程pr, 讀取:
pr.start()# 等待pw結(jié)束:
pw.join()# pr進(jìn)程里是死循環(huán), 無(wú)法等待其結(jié)束, 只能強(qiáng)行終止:
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ù)返回一對(duì)由管道連接的連接對(duì)象,默認(rèn)情況下是雙工(雙向)。
Pipe()返回的兩個(gè)連接對(duì)象代表管道的兩端。 每個(gè)連接對(duì)象都有send()和recv()方法(等等)。 請(qǐng)注意,如果兩個(gè)進(jìn)程(或線(xiàn)程)嘗試同時(shí)讀取或?qū)懭牍艿赖耐欢?,管道中的?shù)據(jù)可能會(huì)損壞。 當(dāng)然,同時(shí)使用管道不同端的過(guò)程也不會(huì)有風(fēng)險(xiǎn)。
返回表示管道末端的一對(duì)Connection(conn1,conn2)對(duì)象。
如果duplex為T(mén)rue(默認(rèn)),則管道是雙向的。
如果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多進(jìn)程實(shí)現(xiàn)進(jìn)程間通信實(shí)例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可繼續(xù)參閱本站:
如有不足之處,歡迎留言指出。
相關(guān)文章
python利用selenium進(jìn)行瀏覽器爬蟲(chóng)
這篇文章主要介紹了python項(xiàng)目實(shí)戰(zhàn)之利用selenium進(jìn)行瀏覽器爬蟲(chóng),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)功能
平穩(wěn)性是時(shí)間序列分析與預(yù)測(cè)的核心概念,在平穩(wěn)條件下,時(shí)間序列的統(tǒng)計(jì)特性(如均值)在時(shí)間維度上保持不變,僅存在隨機(jī)波動(dòng),但是時(shí)間序列通常會(huì)經(jīng)歷結(jié)構(gòu)性斷裂或變化,本文給大家介紹了Python實(shí)現(xiàn)時(shí)間序列變化點(diǎn)檢測(cè)功能,需要的朋友可以參考下2024-09-09
python安裝并使用virtualenv管理包的詳細(xì)過(guò)程
本文主要介紹了Python的安裝過(guò)程和如何使用virtualenv管理包,首先,用戶(hù)需要訪(fǎng)問(wèn)Python官網(wǎng)下載安裝包,并運(yùn)行安裝程序,安裝完成后,在命令行輸入Python,顯示安裝的Python版本號(hào),即表示安裝成功,感興趣的朋友一起看看吧2024-10-10
Python pickle模塊實(shí)現(xiàn)對(duì)象序列化
這篇文章主要介紹了Python pickle模塊實(shí)現(xiàn)對(duì)象序列化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Python開(kāi)發(fā)如何在ubuntu 15.10 上配置vim
這篇文章主要介紹了Python開(kāi)發(fā)如何在ubuntu 15.10 上配置vim 的相關(guān)資料,需要的朋友可以參考下2016-01-01
PyCharm中New Directory 和 New Python
python package這是一個(gè)特殊的目錄,因?yàn)樵趧?chuàng)建該python package的時(shí)候,系統(tǒng)會(huì)自動(dòng)地生成一個(gè)py文件, init.py,這篇文章主要介紹了PyCharm中New Directory 和 New Python Package的區(qū)別,需要的朋友可以參考下2023-12-12
flask框架實(shí)現(xiàn)修改密碼和免密登錄功能
flask是python web開(kāi)發(fā)的常用框架之一。本文將講述flask如何實(shí)現(xiàn)修改密碼和免密登錄功能2021-05-05

