【问题标题】:Returning the first non-zero result from Pool.async_map从 Pool.async_map 返回第一个非零结果
【发布时间】:2020-12-03 15:54:35
【问题描述】:

我正在使用 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]

假设有结果。但是由于它是异步运行的,所以我想尽快得到非零值。

最好的方法是什么?

【问题讨论】:

    标签: python python-3.x multithreading asynchronous


    【解决方案1】:

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

    返回值实际上接近于一个 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()])
    

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2010-11-15
      • 2020-06-24
      • 1970-01-01
      • 2014-04-17
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多