代码之家  ›  专栏  ›  技术社区  ›  Teknophilia

多处理提前退出

  •  2
  • Teknophilia  · 技术社区  · 7 年前

    我有一个循环,它检查值的第一个实例,该值的计算结果为 True :

    for i in l:
        if fun(i):
            return i
    return None
    

    我想使用多处理池来加快速度,但我的理解是,池只会运行 fun 在中的每个元素上 l 。有没有一种方法可以在共享时实现某种“短路”?

    1 回复  |  直到 7 年前
        1
  •  5
  •   tdelaney    7 年前

    这就是 terminate 方法是为,但您必须小心使用它。它会杀死工作进程,但令人惊讶的是,它不会阻止您在等待呼叫时永远阻塞。所以你只有这样才能使用它 apply_async imap_unordered 呼叫。从另一个线程关闭通常会导致对池的调用挂起。在本例中,我设置 chunksize 到1,如果单个工作项具有大量处理,则该值是首选值。您可以设置 块大小 如果工作项成本较低,并且您不介意在完成之前处理更多的项,那么您将获得更大的收益。但不要使用默认值。。。必须处理的项目将在任何事情返回给您之前进行处理。

    import multiprocessing
    
    def worker(item):
        print(item)
        return item
    
    if __name__ == "__main__":
        with multiprocessing.Pool(4) as pool:
            for i in pool.imap_unordered(worker, range(100), chunksize=1):
                if i == 10:
                    print('terminate')
                    pool.terminate()
                    break
        print('done')