并行python数据丢失

2024-09-29 21:31:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()

Tags: instance函数runin列表for全局线程
2条回答

multiprocessing基于进程,而不是线程。重要的区别是:每个进程都有一个单独的内存空间,而线程共享一个公共内存空间。第一次创建时,进程可能(取决于操作系统、生成方法等)能够读取父进程具有的相同值,但如果它写入这些值,则只更改本地值,而不更改父进程的副本。只有线程能够访问任意单个共享全局变量,并使其按预期的方式运行。你知道吗

我建议您查看multiprocessing.Pool及其各种方法来分派任务并在以后检索它们的结果,或者如果您必须使用原始的Process,请查看various ways to exchange data between processes;您不能只分配给全局变量,因为当新的Processforked/spawned时,全局变量将停止共享

在代码中,您创建的是新进程而不是线程。创建流程时,新流程将拥有主流程中变量的深度副本,但它们彼此独立。我认为对于您的案例来说,使用进程而不是线程是有意义的,因为它允许您使用多个内核,而不是由于GIL而限制为单个内核的线程。你知道吗

必须使用进程间通信技术在进程之间进行通信。但是,由于在您的情况下,进程不是持久性守护进程,因此每个进程将模拟结果写入一个不同的唯一文件并从主进程读回是有意义的。你知道吗

相关问题 更多 >

    热门问题