簡體   English   中英

multiprocessing.Process(使用spawn方法):繼承了哪些對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM