如何使用multiprocessing.Pool在线程之间共享字典?

时间:2016-06-03 20:39:30

标签: python python-2.7 multiprocessing

我正在尝试在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()的worker创建了字典的副本;这就是我在处理完成后看不到更新的原因。我是对的吗?

注意:

  1. 我知道可以从run_函数返回值并获取pool.map(run_, ["1"])的结果列表,但是需要将全局变量用于当前任务
  2. 我知道可能的数据集
  3. 我已经在某处看过,在这种情况下不需要global语句但是示例在没有它的情况下以相同的方式工作
  4. 我将[["1", success_map]]传递给pool.map的结果相同;不使用全局变量
  5. 在此示例中是否可以在线程之间共享success_map

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

1 个答案:

答案 0 :(得分:4)

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

在您可以使用的流程之间share data multiprocessing.Valuemultiprocessing.Array。但要注意,在某些情况下,你会need an extra Lock

使用Manager对象,您可以共享大多数数据类型(我认为它必须是可挑剔的)。共享内存的速度较慢。

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

备注

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