gpt4 book ai didi

Python多处理池,加入;不等待继续?

转载 作者:IT老高 更新时间:2023-10-28 21:11:32 27 4
gpt4 key购买 nike

(1) 我正在尝试使用 pool.map 后跟 pool.join(),但 python 似乎并没有等待 pool.map 在继续通过 pool.join() 之前完成。这是我尝试过的一个简单示例:

from multiprocessing import Pool

foo = {1: []}

def f(x):
foo[1].append(x)
print foo

def main():
pool = Pool()
pool.map(f, range(100))
pool.close()
pool.join()
print foo

if __name__ == '__main__':
main()

打印输出只是{1: []},就好像python只是忽略了join命令并在它之前运行了print foo有机会运行 f。预期的结果是 foo{1:[0,1,...,99]},并且使用普通的内置 python map 给出了这个结果。为什么池化版本打印 {1: []},如何更改我的代码以使其打印预期结果?

(2) 理想情况下,我还想将 foo 定义为 main() 中的局部变量并将其传递给 f,但是通过使 foo 作为 f 的第一个参数并使用

来做到这一点

pool.map(functools.partial(f, foo), range(100))

产生相同的输出。 (并且可能还存在每个进程现在都有自己的 foo 副本的问题?)尽管如此,它还是使用普通的 map 工作。

最佳答案

这不是使用 map 的正确方法。

  1. 以这种方式使用全局变量是绝对错误的。进程不共享相同的内存(通常),因此每个 f 都将拥有自己的 foo 副本。要在不同进程之间共享变量,您应该使用 Manager
  2. 传递给 map 的函数通常会返回一个值。

我建议你阅读一些 documentation .

但是,这里是一个虚拟示例,说明如何实现它:

from multiprocessing import Pool

foo = {1: []}

def f(x):
return x

def main():
pool = Pool()
foo[1] = pool.map(f, range(100))
pool.close()
pool.join()
print foo

if __name__ == '__main__':
main()

您也可以执行 pool.map(functools.partial(f, foo), range(100)) 之类的操作,其中 fooManager

关于Python多处理池,加入;不等待继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914828/

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