2017-07-13 59 views
-2

我聽不太懂下面的代碼是如何工作的:使用隊列for循環(Python)的

from multiprocessing import Process, Queue 
import os, time, random 


def write(q): 
    for value in ['A', 'B', 'C']: 
     print 'Put %s to queue...' % value 
     q.put(value) 
     time.sleep(random.random()) 

def read(q): 
    while True: 
     value = q.get(True) 
     print 'Get %s from queue.' % value 

if __name__=='__main__': 
    q = Queue() 
    pw = Process(target=write, args=(q,)) 
    pr = Process(target=read, args=(q,)) 

    pw.start() 
    pr.start() 
    pw.join() 

    pr.terminate() 

似乎pw.join()同步pwpr但我不知道它是如何工作的。我認爲pr.start()pw.start()完成後收益,這意味着Get %s from queue只能在三個Put %s to queue...已被打印後才能收到。我也認爲pool()是用於多進程和process只用於單個進程,但現在看來我完全錯了。

感謝您的幫助!

+0

'pool'是爲了創建一組進程。 'Process'創建一個獨立的進程。兩者都是多處理構造。 –

+1

「我以爲''pr.start()'在'pw.start()'完全結束後繼續」 - 'pw.start()'在「pw」啓動後就「完全結束」了。它不會等待'pw'過程結束。 – user2357112

+0

@ user2357112謝謝,但是當我刪除pw.join()時,我無法得到任何'Get%s'消息,你能告訴我pw.join()扮演了什麼角色嗎? –

回答

0

首先,你的問題應該享有類似「如何參加工作蟒蛇」

join()方法阻塞調用線程(在這種情況下是主線程),直到其加入被稱爲是過程終止。請參閱定義here

因此,在您的代碼中,您將阻止pr.terminate()的調用,直到pw完成。當你刪除pw.join語句時,process pr在啓動後立即終止,這就是爲什麼你沒有看到任何「Get ...」消息。

+0

謝謝!現在我明白了。 –