Python 从Pool.async\u映射返回第一个非零结果

Python 从Pool.async\u映射返回第一个非零结果,python,python-3.x,multithreading,asynchronous,Python,Python 3.x,Multithreading,Asynchronous,我正在使用python多处理库,以便在大量数字上运行大量测试 我有以下语法: 将多处理导入为mp pool=mp.pool(进程=6) res=pool.async_映射(testFunction,arrayOfNumber) 但是,我想返回通过测试的第一个数字,然后退出。我对存储结果数组不感兴趣 目前,testFunction对于任何失败的数字都将返回0,因此如果在没有任何优化的情况下执行此操作,我将等待它完成并使用: 返回过滤器(λx:x!=0,res)[0] 假设有结果。但是,由于它是

我正在使用python多处理库,以便在大量数字上运行大量测试

我有以下语法:

将多处理导入为mp
pool=mp.pool(进程=6)
res=pool.async_映射(testFunction,arrayOfNumber)
但是,我想返回通过测试的第一个数字,然后退出。我对存储结果数组不感兴趣

目前,
testFunction
对于任何失败的数字都将返回0,因此如果在没有任何优化的情况下执行此操作,我将等待它完成并使用:

返回过滤器(λx:x!=0,res)[0]
假设有结果。但是,由于它是异步运行的,所以我希望尽快获得非零值


什么是最好的方法?

我不确定这是否是最好的方法,但这是一种有效的方法。将任务添加到队列是非阻塞的,程序将继续运行。现在,通过存储所有可能的返回值,我可以自己迭代它们

返回值实际上接近于promise对象,现在通过检查它们的
ready()
函数,我可以检查结果是否准备好读取。然后使用
get()
方法,我可以验证该值是多少。如果我知道值为0,我可以提前终止池并返回最终结果

下面是一个演示这一点的简单工作示例:

import time
import multiprocessing as mp


def worker(value):
    print('working')
    time.sleep(3)
    return value


def main():
    pool = mp.Pool(2)  # Only two workers
    results = []
    for n in range(0, 8):
        value = 0 if n == 0 else 1
        results.append(pool.apply_async(worker, (value,)))

    running = True
    while running:
        for result in results:
            if result.ready() and result.get() == 0:
                print(f"There was a zero returned")
                pool.terminate()
                running = False

        if all(result.ready() for result in results):
            running = False

    pool.close()
    pool.join()


if __name__ == '__main__':
    main()
预期产出将是:

working
working
working
There was a zero returned

Process finished with exit code 0
我创建了一个由2个进程组成的小池,它们调用一个函数,该函数将休眠3秒,然后返回1或0。当前,第一个任务将返回0,并且程序将在结果可用后提前终止

如果没有终止任务,则行:

if all(result.ready() for result in results):
    running = False
如果所有进程都已完成,将终止循环

如果您现在想查看所有结果,可以使用:

print([result.get() for result in results if result.ready()])

这非常有帮助,谢谢