等待所有多处理作业完成后再继续

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了等待所有多处理作业完成后再继续相关的知识,希望对你有一定的参考价值。

我希望并行运行一堆作业,然后在所有作业完成后继续。我有类似的东西

# based on example code from https://pymotw.com/2/multiprocessing/basics.html
import multiprocessing
import random
import time

def worker(num):
    """A job that runs for a random amount of time between 5 and 10 seconds."""
    time.sleep(random.randrange(5,11))
    print('Worker:' + str(num) + ' finished')
    return

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

    # Iterate through the list of jobs and remove one that are finished, checking every second.
    while len(jobs) > 0:
        jobs = [job for job in jobs if job.is_alive()]
        time.sleep(1)

    print('*** All jobs finished ***')

它确实有效,但我确信必须有一个更好的方法来等待所有工作完成,而不是一遍又一遍地迭代它们直到它们完成。

答案

关于什么?

for job in jobs:
    job.join()

这将阻塞,直到第一个进程完成,然后是下一个进程,依此类推。了解更多关于join()的信息

另一答案

你可以使用join。它让你等待另一个进程结束。

t1 = Process(target=f, args=(x,))
t2 = Process(target=f, args=('bob',))

t1.start()
t2.start()

t1.join()
t2.join()

您也可以使用barrier它适用于线程,让您指定一些您想要等待的进程,一旦达到此数量,就可以将它们屏障。这里客户端和服务器被假设为Process。

b = Barrier(2, timeout=5)

def server():
    start_server()
    b.wait()
    while True:
        connection = accept_connection()
        process_server_connection(connection)

def client():
    b.wait()
    while True:
        connection = make_connection()
        process_client_connection(connection)

如果您想要更多功能,如共享数据和更多流量控制,您可以使用manager

以上是关于等待所有多处理作业完成后再继续的主要内容,如果未能解决你的问题,请参考以下文章

如何等到承诺完成后再继续循环

如何使“主线程”等待“子线程”执行结束后再继续执行

等待异步任务完成后再继续?

如何在 JS(节点)中使用回调来等待 Async 函数完成后再继续?

异步和多线程的关系

异步和多线程的关系