【问题标题】:How to share dictionary between threads using multiprocessing.Pool?如何使用 multiprocessing.Pool 在线程之间共享字典?
【发布时间】:2016-06-03 20:39:30
【问题描述】:

我正在尝试在 multiprocessing.Pool 的线程之间共享字典。但是,我对当前的实施失败了。测试代码:

#!/usr/bin/env python

import multiprocessing

success_map = {"1": []}

def run_(input):
    global success_map
    successes = success_map.get(input);
    successes.append(0)
    print success_map

pool = multiprocessing.Pool()
pool.map(run_, ["1"])
pool.close()
pool.join()
print success_map

输出是

{'1': [0]}
{'1': []}

在我看来,multiprocessing.Pool() 的工作人员创建了字典的副本;这就是为什么处理完成后我看不到更新。我说的对吗?

注意:

  1. 我知道可以从run_ 函数返回值并作为pool.map(run_, ["1"]) 的结果获取收集的列表,但需要对当前任务使用全局变量
  2. 我知道可能的数据竞争
  3. 我在某处读到 global 语句在这种情况下不需要,但示例在没有它的情况下工作方式相同
  4. 我通过[["1", success_map]]pool.map 得到了相同的结果;不使用全局变量

在这个例子中,是否可以在线程之间共享success_map

相关但不是答案:Python Multiprocessing appending list

【问题讨论】:

    标签: python python-2.7 multiprocessing


    【解决方案1】:

    多处理使用单独的进程,而不是线程。这些进程并不像线程那样共享所有内存。

    到您可以使用的进程之间的share data,例如multiprocessing.Valuemultiprocessing.Array。但请注意,在某些情况下,您会need an extra Lock

    使用Manager 对象,您可以共享大多数数据类型(我认为它必须是可腌制的)。而且共享内存更慢。

    或者您可以创建一个multiprocessing.Pipe 来在进程之间交换数据。


    注意事项

    1. 多处理模块确实在内部使用线程 家政服务。
    2. 通常,最好避免在进程之间发送大量数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多