2017-04-13 46 views
-1

我最近開始使用Python多處理模塊。我瞭解隊列的解釋,但最近我在https://pymotw.com/2/multiprocessing/communication.html上發現隊列不需要作爲參數傳遞給Proccess構造方法,例如,隊列對象是否在python多進程模塊的進程之間自動共享?

p = Process(target=f, args=(q,)), 

相反,它們似乎是全局共享的。我認爲這只是我們管理隊列時的情況,即

queue = manager.Queue() 

有人可以幫我理解嗎?

+1

該文章的快速瀏覽不顯示您描述的內容。我在任何地方看到一個使用隊列的進程,它明確接收該隊列作爲參數。 – user2357112

+0

不在類Consumer(multiprocessing.Process)定義的部分。隊列是該類的成員,該類從進程繼承。 – user3616359

+1

「消費者」類採用它用作參數的所有隊列。 – user2357112

回答

2

在Unix中,子進程創建爲fork()

在Windows中,子進程由invoking the same script with special arguments創建。

在這兩種情況下,子進程中可能都會有q變量,因爲它繼承了狀態或因爲相關代碼在執行到達輔助函數之前已運行。

但是,這是不夠的。需要在流程之間建立一個IPC,以發揮其作爲通信渠道的作用。否則,它只是一個普通的本地對象。

如有疑問,請參閱the official documentation這是權威的信息源,通常質量非常好。 隨着multiprocessing,它的特別是重要的是堅持文檔,因爲由於其古怪的性質,各種事情可能似乎工作,但以不可預知的方式打破。

+0

只是澄清,這可以工作,因爲q是在子進程中繼承和IPC建立,但不建議這樣工作? – user3616359

+0

@ user3616359確切地說 - 即使碰巧有效,「建議不要這樣工作」。 –

+0

@ user3616359涉及多個相互作用的過程調試的問題是夠硬,即使沒有儘可能多的隱含邏輯引擎蓋下,如'multiprocessing',因爲它們通常不能可靠地再現。所以,你應該儘可能地避免它們從頭開始。 –

相關問題