一个函数的多处理池映射异步,然后在下一个函数之前阻塞(python 3)

一个函数的多处理池映射异步,然后在下一个函数之前阻塞(python 3),python,multithreading,asynchronous,multiprocessing,Python,Multithreading,Asynchronous,Multiprocessing,请注意,此演示代码生成了一些GB数据 一段时间以来,我一直在使用下面的代码版本进行多处理。当池中每个进程的运行时间相似时,它工作得很好,但是如果一个进程花费的时间更长,那么我最终会遇到许多阻塞的进程在等待一个进程,因此我尝试使它异步运行—一次只运行一个函数 例如,如果我有70个内核,需要运行一个函数2000次,我希望它异步运行,然后在调用下一个函数之前等待最后一个进程。目前,它只提交一批进程,其中包括我给它的内核数量,而每批进程都必须等待最长的进程 正如您所看到的,我尝试过使用map\u asy

请注意,此演示代码生成了一些GB数据

一段时间以来,我一直在使用下面的代码版本进行多处理。当池中每个进程的运行时间相似时,它工作得很好,但是如果一个进程花费的时间更长,那么我最终会遇到许多阻塞的进程在等待一个进程,因此我尝试使它异步运行—一次只运行一个函数

例如,如果我有70个内核,需要运行一个函数2000次,我希望它异步运行,然后在调用下一个函数之前等待最后一个进程。目前,它只提交一批进程,其中包括我给它的内核数量,而每批进程都必须等待最长的进程

正如您所看到的,我尝试过使用map\u async,但这显然是错误的语法。有人能帮我吗

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”行,然后它就可以完成我想要的任务!我不知道为什么我认为我需要它,一定在什么地方见过。谢谢@如果你认为我的答案是对的,你可以点击左边的复选标记来接受答案。