簡體   English   中英

子進程未在 Windows 上繼承 Python 全局變量

[英]Child process not inheriting Python global variable on Windows

我知道子進程在 fork/spawn 之后不會看到所做的更改,並且 Windows 進程不會繼承不使用共享內存的全局變量。 但是我遇到的情況是,孩子們無法看到在 fork/spawn 之前對共享內存中的全局變量所做的更改。

簡單演示:

from multiprocessing import Process, Value
global foo
foo = Value('i',1)
def printfoo():
  global foo 
  with foo.get_lock():
    print(foo.value)
if __name__ == '__main__':
  with foo.get_lock():
    foo.value = 2
  Process(target=printfoo).start()

在 Linux 和 MacOS 上,這顯示預期的 2。在 Windows 上,它顯示 1,即使對全局值的修改是在調用Process之前進行的。 如何使 Windows 上的子進程也可以看到更改?

這里的問題是您的子進程創建了一個新的共享值,而不是使用父進程創建的共享值。 您的父進程需要顯式地將Value發送給子進程,例如,作為目標函數的參數:

from multiprocessing import Process, Value

def use_shared_value(val):
    val.value = 2

if __name__ == '__main__':
    val = Value('i', 1)
    p = Process(target=use_shared_value, args=(val,))
    p.start()
    p.join()
    print(val.value)

(不幸的是,我沒有安裝 Windows Python 來測試這個。)


Windows 上的子進程不能繼承全局變量,無論這些全局變量是否被初始化為multiprocessing.Value實例。 multiprocessing.Value不會改變子級重新執行您的文件的事實,並且重新執行Value構造不會使用父級分配的共享資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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