[英]Spawn multiprocessing.Process under different python executable with own path
[英]multiprocessing.Process (with spawn method): which objects are inherited?
docs(python 3.4)解釋說,使用spawn
,“子進程將僅繼承運行進程對象的run()
方法所需的那些資源”。
但是哪些對象是“必需的”? 我的閱讀方式告訴我,從run()
內部可以訪問的所有對象都是“必需的”,包括以args
傳遞給Process.__init__
args
,以及存儲在全局變量以及類,函數中的任何東西在全局范圍及其屬性中定義。 但是,這是不正確的。 以下代碼確認未繼承全局變量中存儲的對象:
# running under python 3.4 / Windows
# but behaves the same under Unix
import multiprocessing as mp
x = 0
class A:
y = 0
def f():
print(x) # 0
print(A.y) # 0
def g(x, A):
print(x) # 1
print(A.y) # 0; really, not even args are inherited?
def main():
global x
x = 1
A.y = 1
p = mp.Process(target = f)
p.start()
q = mp.Process(target = g, args = (x, A))
q.start()
if __name__=="__main__":
mp.set_start_method('spawn')
main()
是否有明確的規則規定要繼承哪些對象?
編輯:
確認一下:在Ubuntu上運行它會產生相同的輸出。 (感謝@mata澄清了我忘記在main()
添加了global x
。這一遺漏使我的示例感到困惑;如果在Ubuntu下將'spawn'
切換為'fork'
,也會影響結果。我現在添加了global x
到上面的代碼。)
這與將類發送到派生的Process時的腌制方式有關。 類的腌制版本實際上並不包含其內部狀態,而僅包含模塊和類的名稱:
class A:
y = 0
pickle.dumps(A)
# b'\x80\x03c__main__\nA\nq\x00.'
這里沒有關於y
信息,它與對該類的引用相當。
當作為argumeht傳遞給g
,該類將在生成的進程中被取消選擇,該類將在必要時導入其模塊(在這里__main__
)並返回對該類的引用,因此,對您在main
函數中進行的更改不會對它產生影響if __name__ == "__main__"
塊將不會在子if __name__ == "__main__"
中執行。 f
直接在其模塊中使用該類,因此效果基本相同。
x
顯示不同值的原因略有不同。 您的f
函數將從模塊中打印全局變量x
。 在main()
函數中,您還有另一個局部變量x
,因此在此處設置x = 1
不會影響兩個進程中的模塊級別x
。 它作為參數傳遞給g
,因此在這種情況下,它將局部值為1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.