gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:15 25 4
gpt4 key购买 nike

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

注意:

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

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

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

最佳答案

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

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

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

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


注意事项:

  1. 多处理模块确实在内部使用线程客房服务。
  2. 一般来说,最好避免在进程之间发送大量数据。

关于python - 如何使用 multiprocessing.Pool 在线程之间共享字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37623016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com