【发布时间】:2018-03-26 10:34:24
【问题描述】:
我有一个我使用的单例类。我在我的主线程上创建了这个类的一个实例。
我创建了几个多进程,对我来说似乎合乎逻辑的(由于 GIL 的工作方式)是,当我在那里实例化同一个类时,它的一个新实例,它看不到在我的主线程中实例化的那个。
但是如果我在 Linux 上做同样的事情,当创建我的多进程并实例化我的类时,它会返回指向在我的主线程中创建的实例的指针,因此可以看到来自那个实例的数据。
这可能涉及我不理解的 Linux 和 Windows 中线程的一些基本原理。但是,如果有人可以帮助我简要理解或指出我可以在哪里阅读它
问候
编辑
在 Windows 上:
def child_process_function():
SingletonThread = instantiate_singleton() <-- This will be a new instance
do_work()
SingletonMain = instantiate_singleton()
process = multiprocessing.Process(target=child_process_function)
process.start()
在 Linux 上
def child_process_function():
SingletonThread = instantiate_singleton() <-- This will contain the data from the SingletonMain.
do_work()
SingletonMain = instantiate_singleton()
process = multiprocessing.Process(target=child_process_function)
process.start()
现在阅读您的链接后,Linux SingletonThread 并不像我最初认为的那样指向 SingletonMain,它只是复制了数据。但是我的问题是,因为数据没有在 Windows 上被复制,所以我通过队列发送数据(数据一直在变化,所以这是所需的方法)。但是,类上有一个 Overwrite 块(它包含设置),所以如果数据已经存在,就像在 Linux 上一样,我会在类上得到并写入错误。但是添加。
import multiprocessing as mp
mp.set_start_method('spawn')
解决了我的问题。
【问题讨论】:
标签: linux windows python-3.x multiprocessing