我有一个python函数,它在一个全局列表中创建并存储一个对象实例,并且该函数由一个线程调用。当线程运行时,列表应该是应该填充的,但是当线程退出列表时是空的,我不知道为什么。任何帮助,将不胜感激。
simulationResults = []
def run(width1, height1, seed1, prob1):
global simulationResults
instance = Life(width1, height1, seed1, prob1)
instance.run()
simulationResults.append(instance)
这主要是通过以下方式调用的:
for i in range(1, nsims + 1):
simulations.append(multiprocessing.Process(target=run, args=(width, height, seed, prob)))
simulations[(len(simulations) - 1)].start()
for i in simulations:
i.join()
答案 0 :(得分:0)
在您的代码中,您正在创建新进程而不是线程。创建流程时,新流程将在主流程中拥有变量的深层副本,但它们彼此独立。我认为对于你的情况,使用进程而不是线程是有意义的,因为它允许你使用多个核,而不是由于GIL而限于单个核的线程。
您必须使用进程间通信技术在进程之间进行通信。但是,在您的情况下,进程不是持久性守护进程,因此将simulationResults写入每个进程的不同唯一文件并从主进程中读回它是有意义的。
答案 1 :(得分:0)
multiprocessing
基于进程,而不是线程。重要的区别:每个进程都有一个单独的内存空间,而线程共享一个共同的内存空间。首次创建时,进程可能(取决于操作系统,生成方法等)能够读取父进程具有的相同值,但是如果它写入它们,只更改本地值,而不是父本的副本。只有线程可以依赖于能够访问任意单个共享全局变量并使其按预期运行。
我建议查看multiprocessing.Pool
及其各种方法,以便稍后调度任务并检索结果,或者如果必须使用原始Process
es,请查看{{3} };你不能只分配给一个全局变量,因为当新Process
fork
编辑/ spawn
时,全局变量不再被共享。