gpt4 book ai didi

python - 如何在没有回调的情况下使用 multiprocessing.Pool async?

转载 作者:太空宇宙 更新时间:2023-11-03 14:49:35 25 4
gpt4 key购买 nike

所以,我有一个我认为一定很常见的问题:

我想用 multiprocessing.Pool 并行化一个脚本,将输入传递给池,让它并行处理它们,并在父进程中接收输出。

apply_async() 看起来最适合我想做的事情。但我不能只提供回调函数,因为最后我想将所有结果打印到一个文件中。我认为将打印到单个文件句柄的回调传递给它会导致困惑的结果(甚至不确定我是否可以像那样在进程之间传递文件句柄)。

那么将输入提交到Pool,然后接收输出并在主进程中处理它们的最佳方式是什么?目前我正在收集 AsyncResult列表中的对象并定期迭代它,对每个对象调用 .get() 方法。

更新

我将澄清我的问题的一些参数以回应评论:

  1. @martineau 和@Juggernaut:我所说的不“困惑”是指我真的很想保留输入的顺序,以便输出的顺序相同。

  2. @RolandSmith 和@martineau:我的主要过程只是从文件中读取输入,将它们交给池,然后打印结果。我可以只调用 .apply(),但是主进程在继续之前等待函数完成。我正在使用 multiprocessing 来获得并行化的好处并同时处理许多输入。

最佳答案

正如您在评论中所要求的,这里的代码显示了如何使用 Pool.map() 进行操作而不是 Pool.async()——这似乎更适合这个问题,因为需要等待所有结果才能完成进一步的输出处理(例如,它需要在同一个顺序作为输入)。

如您所见,它需要的代码大大减少,并且不需要在输出结果之前对结果进行排序(因此可能也更快)。

import multiprocessing as mp
from random import randint
from time import sleep

def my_func(x):
print('my_func:', x)
sleep(randint(1, 3)) # Take a varying amount of time to finish.
return x*x

if __name__ == '__main__':

input_data = range(10)
with mp.Pool(10) as pool:
result_list = pool.map(my_func, input_data) # Blocks until finished.

print('result_list:', result_list) # Will be in same order as input_data.

输出:

my_func: 3
my_func: 2
my_func: 1
my_func: 0
my_func: 8
my_func: 5
my_func: 7
my_func: 6
my_func: 4
my_func: 9
result_list: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

关于python - 如何在没有回调的情况下使用 multiprocessing.Pool async?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46833936/

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