【问题标题】:Parallel python loss of data并行python丢失数据
【发布时间】:2016-03-23 02:41:07
【问题描述】:

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

【问题讨论】:

标签: python parallel-processing python-multithreading


【解决方案1】:

multiprocessing 基于进程,而不是线程。重要区别:每个进程都有一个单独的内存空间,而线程共享一个公共内存空间。首次创建时,进程可能(取决于操作系统、spawn 方法等)能够读取父进程具有的相同值,但如果它向它们写入,只有本地值被改变,而不是父母的副本。只有线程可以依赖能够访问任意单个共享全局变量并使其行为符合预期。

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

【讨论】:

    【解决方案2】:

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

    您将不得不使用进程间通信技术在进程之间进行通信。但是,由于在您的情况下,进程不是持久性守护进程,因此每个进程将 SimulationResults 写入不同的唯一文件并从主进程中读取它们是有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多