簡體   English   中英

生成過程中的 Static 變量未初始化

[英]Static variables in spawn processes are not initialised

對我來說很奇怪,“spawn”過程不會復制 class 的 static 變量,但是使用“fork”一切正常。

代碼:

import typing as t
import multiprocessing as mp
from concurrent.futures import ProcessPoolExecutor


class Foo:
    static_var: int

    def __init__(self):
        pass


def func(foo_class: t.Type[Foo]):
    return foo_class.static_var


if __name__ == "__main__":
    # with ProcessPoolExecutor(mp_context=mp.get_context("fork")) as executor:
    with ProcessPoolExecutor(mp_context=mp.get_context("spawn")) as executor:
        foo_class = Foo
        foo_class.static_var = 10
        res = executor.map(func, [foo_class, foo_class])
        print(list(res))
    print('Done')

Output“叉子”:

[10, 10]
Done

Output“產卵”:

AttributeError: type object 'Foo' has no attribute 'static_var'

Python 版本:3.8.5

我不知道如何通過生成來克服它(而且我不完全理解為什么它不起作用)。 生成過程再次啟動自己的解釋器和導入模塊(和類?),這就是為什么 static 變量沒有初始化的原因? 如何通過 class 傳遞變量?

在多處理中, spwanfork-server工作進程是新的 python 進程。
所有 memory 狀態都是新鮮的,並且if __name__ == "__main__:"塊未執行。 在這個意義上,static class 變量不是 static。

fork工作進程中,整個進程 memory 被復制,因此 class 變量可能被復制,但一個進程中的任何更改都不會影響其他進程。

兩種可能的解決方案:

  • 修改任務 function 和 arguments 使得任務是自包含的並且不依賴於非靜態環境。
  • 使用ProcessPoolExecutor中的initializer參數正確設置 static 變量。
def worker_initializer():
    foo_class = Foo
    foo_class.static_var = 10

with ProcessPoolExecutor(
    initializer=worker_initializer,
    mp_context=mp.get_context("spawn")
) as executor:
    pass

暫無
暫無

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

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