我正在尝试在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创建了字典的副本;这就是我在处理完成后看不到更新的原因。我是对的吗?
注意:
run_
函数返回值并获取pool.map(run_, ["1"])
的结果列表,但是需要将全局变量用于当前任务global
语句但是示例在没有它的情况下以相同的方式工作[["1", success_map]]
传递给pool.map
的结果相同;不使用全局变量在此示例中是否可以在线程之间共享success_map
?
答案 0 :(得分:4)
多处理使用单独的进程,而不是线程。这些进程不像线程一样共享所有内存。
在您可以使用的流程之间share data multiprocessing.Value
或multiprocessing.Array
。但要注意,在某些情况下,你会need an extra Lock。
使用Manager
对象,您可以共享大多数数据类型(我认为它必须是可挑剔的)。共享内存的速度较慢。
或者您可以创建一个multiprocessing.Pipe
来在进程之间交换数据。
备注: