Python 多進程編程之 進程間的通訊(Queue)python
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,執行結果ui
1265開始讀取 <built-in function getpid>開始寫入: W A N G read to W read to A read to N read to G
4,進程間通訊經常使用函數spa
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:未空