如何同时加入一个 multiprocessing.Process() 列表?

Ent*_*nte 5 python parallel-processing multiprocessing python-3.x python-multiprocessing

给定一个list()正在运行multiprocessing.ProcessProcess.join实例,我如何加入所有实例并在没有超时和循环的情况下在一个退出时立即返回?

例子

from multiprocessing import Process
from random import randint
from time import sleep
def run():
    sleep(randint(0,5))
running = [ Process(target=run) for i in range(10) ]

for p in running:
    p.start()
Run Code Online (Sandbox Code Playgroud)

我怎样才能阻止,直到至少一个Processp退出?

我不想做的是:

exit = False
while not exit:
    for p in running:
        p.join(0)
        if p.exitcode is not None:
            exit = True
            break
Run Code Online (Sandbox Code Playgroud)

Dar*_*aut 6

您可以使用multiprocessing.connection.wait()(Python 3.3+)Process.sentinel一次等待多个s。一个哨兵将准备就绪,一旦进程退出,从而疏通connection.wait()

multiprocessing.connection.wait(object_list,超时=无)

等到 object_list 中的对象准备就绪。返回 object_list 中准备好的对象的列表。如果 timeout 是一个浮点数,那么调用最多会阻塞多少秒。如果 timeout 是 None ,那么它将无限期地阻塞。负超时相当于零超时。

对于 Unix 和 Windows,一个对象可以出现在 object_list 中,如果它是

  • 一个可读的 Connection 对象;

  • 一个已连接且可读的 socket.socket 对象;或者

  • Process 对象的哨兵属性。

当有数据可供读取或另一端已关闭时,连接或套接字对象已准备就绪。...

from multiprocessing import Process, connection, current_process
from random import randint
from time import sleep
from datetime import datetime


def run():
    sleep(randint(2,10))
    print(f"{datetime.now()} {current_process().name} exiting")


if __name__ == '__main__':

    pool = [Process(target=run) for _ in range(4)]

    for p in pool:
        p.start()

    print(f"{datetime.now()} {current_process().name} waiting")
    connection.wait(p.sentinel for p in pool)
    print(f"{datetime.now()} {current_process().name} unblocked")
Run Code Online (Sandbox Code Playgroud)

示例输出:

2019-07-22 21:54:07.061989 MainProcess waiting
2019-07-22 21:54:09.062498 Process-3 exiting
2019-07-22 21:54:09.063565 MainProcess unblocked
2019-07-22 21:54:09.064391 Process-4 exiting
2019-07-22 21:54:14.068392 Process-2 exiting
2019-07-22 21:54:17.062045 Process-1 exiting

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

  • @LennartRolland 启动进程后,您将“pool”列表转换为字典,在其中将进程的哨兵值映射到相应的“Process”实例。然后,当“connection.wait()”带着哨兵返回时,您可以在“pool”字典中查找。 (2认同)