gpt4 book ai didi

python - 从Pool.async_map返回第一个非零结果

转载 作者:行者123 更新时间:2023-12-03 13:22:59 25 4
gpt4 key购买 nike

我正在使用python多处理程序库,以便在大量数字上运行许多测试。
我有以下语法:

import multiprocessing as mp
pool = mp.Pool(processes = 6)
res = pool.async_map(testFunction, arrayOfNumbers)
但是,我想返回通过测试的第一个数字,然后退出。我对存储结果数组不感兴趣。
当前, testFunction将为任何失败的数字返回0,因此,如果没有进行任何优化,我将等待它完成并使用:
return filter(lambda 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()])

关于python - 从Pool.async_map返回第一个非零结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65129421/

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