并行 python 数据丢失
Parallel python loss of data
我有一个 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()
在您的代码中,您正在创建新进程而不是线程。创建进程时,新进程将拥有主进程中变量的深层副本,但它们彼此独立。我认为对于您的情况,使用进程而不是线程是有意义的,因为它允许您利用多个内核,而不是由于 GIL 而被限制为单个内核的线程。
您将不得不使用进程间通信技术在进程之间进行通信。但是由于在您的情况下进程不是持久守护进程,因此将每个进程的模拟结果写入不同的唯一文件并从主进程中读回它们是有意义的。
multiprocessing
基于进程,而不是线程。重要区别:每个进程都有独立的内存 space,而线程共享公共内存 space。首次创建时,进程可能(取决于OS、生成方法等)能够读取相同的值父进程有,但如果它写入它们,则只会更改本地值,而不是父进程的副本。只有线程可以依赖于能够访问任意单个共享全局变量并使其按预期运行。
我建议查看 multiprocessing.Pool
及其各种方法来分派任务并稍后检索结果,或者如果您必须使用原始 Process
es,请查看 various ways to exchange data between processes;您不能只分配给全局变量,因为当新 Process
被 fork
ed/spawn
ed.
时,全局变量将停止共享
我有一个 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()
在您的代码中,您正在创建新进程而不是线程。创建进程时,新进程将拥有主进程中变量的深层副本,但它们彼此独立。我认为对于您的情况,使用进程而不是线程是有意义的,因为它允许您利用多个内核,而不是由于 GIL 而被限制为单个内核的线程。
您将不得不使用进程间通信技术在进程之间进行通信。但是由于在您的情况下进程不是持久守护进程,因此将每个进程的模拟结果写入不同的唯一文件并从主进程中读回它们是有意义的。
multiprocessing
基于进程,而不是线程。重要区别:每个进程都有独立的内存 space,而线程共享公共内存 space。首次创建时,进程可能(取决于OS、生成方法等)能够读取相同的值父进程有,但如果它写入它们,则只会更改本地值,而不是父进程的副本。只有线程可以依赖于能够访问任意单个共享全局变量并使其按预期运行。
我建议查看 multiprocessing.Pool
及其各种方法来分派任务并稍后检索结果,或者如果您必须使用原始 Process
es,请查看 various ways to exchange data between processes;您不能只分配给全局变量,因为当新 Process
被 fork
ed/spawn
ed.