Queue用法
?
Queue是多進程安全的隊列,可以使用Queue實現多進程之間的數據傳遞。put方法用以插入數據到隊列中,put方法還有兩個可選參 數:blocked和timeout。如果blocked為True(默認值),并且timeout為正值,該方法會阻塞timeout指定的時間,直到 該隊列有剩余的空間。如果超時,會拋出Queue.Full異常。如果blocked為False,但該Queue已滿,會立即拋出Queue.Full 異常。
get方法可以從隊列讀取并且刪除一個元素。同樣,get方法有兩個可選參數:blocked和timeout。如果blocked為 True(默認值),并且timeout為正值,那么在等待時間內沒有取到任何元素,會拋出Queue.Empty異常。如果blocked為 False,有兩種情況存在,如果Queue有一個值可用,則立即返回該值,否則,如果隊列為空,則立即拋出Queue.Empty異常。Queue的一 段示例代碼:
?
#-*- encoding:utf-8 -*- import sys import time reload(sys) sys.setdefaultencoding('utf-8') import multiprocessingdef writer_proc(q):print"start write_proc"time.sleep(3)try:q.put(1, block = False)print"writer_proc\n"except:passprint"finish write_proc"def reader_proc(q):print"start reader_proc"time.sleep(2)# time.sleep(3)#如果這句話代替上面那句話,那么整個代碼運行順序其實是不定的try:print (q.get(block = False))#從隊列讀取一個元素并且刪除一個元素print"read_proc\n"except:passprint"finish reader_proc"if __name__ == "__main__":#隊列的作用是一個入口輸入數據,出口讀取數據q = multiprocessing.Queue()writer = multiprocessing.Process(target=writer_proc, args=(q,))#開一個進程writer.start()reader = multiprocessing.Process(target=reader_proc, args=(q,))#開一個進程reader.start()print"#############################"writer.join()print"------------writer.join()------------"reader.join()print"------------reader.join()-------------------"?
如果這是在分析別人的代碼,那么要分四種情況:
reader跑完和沒跑完,writer跑完和沒跑完,然后排列組合共四種
然后才能分析清楚join是否有了阻塞的效果。
join就是去“回收”線程,如果沒跑完,當然要等跑完了,如果已經跑完了,立刻就“回收”了
join是阻塞的(如果沒跑完,要等),至于是否代碼真的有花時間等,那個要看你進程具體做的什么,等等
queue自身可以檢查 empty() (是否為空),也可以直接做get然后自己去收一下empty的錯誤,也可以用task_done()作為信號傳遞
join是說“等待”如果你的子進程已經結束了,就不用等待了
join這里,只是說等待的順序(假設兩個進程都沒有跑完,需要時間跑)
那么先等待哪個結束
總結:
在兩個進程都沒運行完的情況下,join是確保哪個進程先結束,另外一個進程先阻塞
對于進程運行完的,有join=沒有join
join對于已經運行完的進程是可以看做無效的
?
?
總結
- 上一篇: Event的用法
- 下一篇: pipe实现单工和半双工模式