Python 多進程編程之 進程間的通信(Queue)
1,進程間通信
Process有時是需要通信的,操作系統提供了很多機制來實現進程之間的通信,而Queue就是其中的一個方法
----這是操作系統開辟的一個空間,可以讓各個子進程把信息放到Queue中,也可以把自己需要的信息取走
----這就相當於系統給python開辟了一個聊天室,讓python創建的子進程可以在這個聊天室里暢所欲言
----一個進程可以放多條消息到Queue中
2,實例
#導入Queue,Process
from multiprocessing import Queue,Process
import os
#寫入進程
def wp(q):
print("%s開始寫入:"%os.getpid)
for i in "WANG":
#將信息寫入隊列
q.put(i)
print(i)
#讀取進程
def rd(q):
print("%s開始讀取"%os.getpid())
while True:
if not q.empty():
#從隊列讀取信息
print("read to %s"%q.get())
if __name__=="__main__":
#創建隊列
q = Queue()
#創建寫入進程
w = Process(target=wp,args=(q,))
#啟動寫入進程
w.start()
#創建讀取進程
r = Process(target=rd,args=(q,))
#啟動讀取進程
r.start()
3,執行結果
1265開始讀取 <built-in function getpid>開始寫入: W A N G read to W read to A read to N read to G
4,進程間通信常用函數
q.Queue()
--------------------------------------------------------
def __init__(self, maxsize=-1):
self._maxsize = maxsize
---- maxsize=-1,表示隊列個數無窮大
---- 初始化Queue對象時,(例,q=Queue() )
或括號中沒有指定最大可接收的消息數量,或數量為負值,
那么就表示可接收的消息數量沒有上限
q.put("信息")
---------------------------------
將信息放入隊列中
def put(self, obj, block=True, timeout=None):
pass
obj----傳入的信息
block=True----阻塞=真 : 真阻塞(默認值)
timeout=None----等待時間,None(默認值)表示無限等待, 如果timeou設置值,則會等待N秒后,強制放入(put)
q.get()
----------------------------------
def get(self, block=True, timeout=None):
pass
從隊列中拿出一個進程消息
block=True 默認值是真阻塞,
timeout=None 意思是 無限,無窮
兩個合在一起的意思是 無限阻塞,無窮等待
隊列的特點是:先進先出 所以get拿的順序也是,先進先出 first in first out
q.put_nowait()
-------------------------------------
def put_nowait(self, obj):
pass
相當於q.put(obj,False)
不等待,直接放入
q.get_nowait()
----------------------------------------
def get_nowait(self):
pass
不做等待,就是要獲取
如果隊列中沒有消息,就會報錯
----解決報錯,加入try 異常處理
q.qsize()
------------------------------------
def qsize(self):
return 0
返回當前隊列包含的消息數量
q.full() ------------------------------ 檢測隊列是否已經滿了 True: 滿 False: 未滿
q.empty()
---------------------------------
def empty(self):
return False
檢測隊列是否為空
True:空
False:未空
