一个函数的多处理池映射异步,然后在下一个函数之前阻塞(python 3)
请注意,此演示代码生成了一些GB数据 一段时间以来,我一直在使用下面的代码版本进行多处理。当池中每个进程的运行时间相似时,它工作得很好,但是如果一个进程花费的时间更长,那么我最终会遇到许多阻塞的进程在等待一个进程,因此我尝试使它异步运行—一次只运行一个函数 例如,如果我有70个内核,需要运行一个函数2000次,我希望它异步运行,然后在调用下一个函数之前等待最后一个进程。目前,它只提交一批进程,其中包括我给它的内核数量,而每批进程都必须等待最长的进程 正如您所看到的,我尝试过使用map\u async,但这显然是错误的语法。有人能帮我吗一个函数的多处理池映射异步,然后在下一个函数之前阻塞(python 3),python,multithreading,asynchronous,multiprocessing,Python,Multithreading,Asynchronous,Multiprocessing,请注意,此演示代码生成了一些GB数据 一段时间以来,我一直在使用下面的代码版本进行多处理。当池中每个进程的运行时间相似时,它工作得很好,但是如果一个进程花费的时间更长,那么我最终会遇到许多阻塞的进程在等待一个进程,因此我尝试使它异步运行—一次只运行一个函数 例如,如果我有70个内核,需要运行一个函数2000次,我希望它异步运行,然后在调用下一个函数之前等待最后一个进程。目前,它只提交一批进程,其中包括我给它的内核数量,而每批进程都必须等待最长的进程 正如您所看到的,我尝试过使用map\u asy
import os
p='PATH/test/'
def f1(tup):
x,y=tup
to_write = x*(y**5)
with open(p+x+str(y)+'.txt','w') as fout:
fout.write(to_write)
def f2(tup):
x,y=tup
print (os.path.exists(p+x+str(y)+'.txt'))
def call_func(f,nos,threads,call):
print (call)
for i in range(0, len(nos), threads):
print (i)
chunk = nos[i:i + threads]
tmp = [('args', no) for no in chunk]
pool.map(f, tmp)
#pool.map_async(f, tmp)
nos=[i for i in range(55)]
threads=8
if __name__ == '__main__':
with Pool(processes=threads) as pool:
call_func(f1,nos,threads,'f1')
call_func(f2,nos,threads,'f2')
map
只会返回,而map\u async
只会在当前区块的所有任务完成后调用回调
因此,您只能一次将所有任务分配给map
/map\u async
,或者使用apply\u async
(最初称为threads
次),其中回调
调用apply\u async
,用于下一个任务
如果调用的实际返回值无关紧要(或者至少它们的顺序无关紧要),
imap\u unordered
可能是另一个有效的解决方案,它可以一次为它提供所有任务(或者由迭代器/生成器按需生成任务)我所要做的就是删除“chunk”行,然后它就可以完成我想要的任务!我不知道为什么我认为我需要它,一定在什么地方见过。谢谢@如果你认为我的答案是对的,你可以点击左边的复选标记来接受答案。