多处理队列终止

Mulitprocessing queue termination

提问人:Jake Snell 提问时间:2/25/2021 更新时间:2/25/2021 访问量:27

问:

我有一个程序,我想通过多处理将其分成 10 个部分。每个工作人员将使用不同的变量来搜索相同的答案来查找它(在本例中,它是暴力破解的密码)。如何让进程传达其状态,以及如何在一个进程找到答案后终止所有进程。谢谢!

Python 多处理

评论


答:

0赞 Booboo 2/25/2021 #1

如果您要将其分成 10 个部分,那么您应该有 10 个内核,或者至少您的工作线程函数不应 100% 受 CPU 限制。

以下代码使用一个实例初始化每个进程,工作器函数将向其写入其结果。主进程等待写入队列的第一个条目,然后终止所有池进程。对于此演示,将 worker 函数传递参数 1, 2, 3, ...10,然后休眠该时间并返回传递的参数。因此,我们期望传递参数值 1 的 worker 函数首先完成,并且程序的总运行时间应该略大于 1 秒(创建 10 个进程需要一些时间):multiprocess.Queue

import multiprocessing
import time

def init_pool(q):
    global queue
    queue = q

def worker(x):
    time.sleep(x)
    # write result to queue
    queue.put_nowait(x)


def main():
    queue = multiprocessing.Queue()
    pool = multiprocessing.Pool(10, initializer=init_pool, initargs=(queue,))
    for i in range(1, 11):
        # non-blocking:
        pool.apply_async(worker, args=(i,))
    # wait for first result
    result = queue.get()
    pool.terminate() # kill all tasks
    print('Result: ', result)

# required for Windows:
if __name__ == '__main__':
    t = time.time()
    main()
    print('total time =', time.time() - t)

指纹:

Result:  1
total time = 1.2548246383666992