如何并行启动功能,检查它们是否完成,并在 python 中启动一个新功能?

How to start functions in parallel, check if they are done, and start a new function in python?

我想编写一个 python 代码来执行以下操作:

最后,我希望 3 个进程总是 运行 并行,直到我需要 运行 的所有函数都 运行。这是一些伪代码:

import time
import random
from multiprocessing import Process

# some random function which can have different execution time
def foo():
    time.sleep(random.randint(10) + 2)
    return 42

# Start 3 functions
p = []
p.append(Process(target=foo))
p.append(Process(target=foo))
p.append(Process(target=foo))

while(True):
    
    # wait until one of the processes has finished
    ???

    # then add a new process so that always 3 are running in parallel
    p.append(Process(target=foo))

我很确定我不清楚我想要什么。请教

您可以使用多处理模块的Pool

my_foos = [foo, foo, foo, foo]

def do_something(method):
     method()


from multiprocessing import Pool
with Pool(3) as p:
    p.map(do_something, my_foos)

数字 3 表示并行作业的数量。 map 将输入作为函数的参数 do_something 在您的情况下,do_something 可以是一个调用您要处理的函数的函数,这些函数作为列表传递给输入。

您真正想要的是启动三个进程并向队列提供您要执行的作业。然后将只有三个进程,当一个进程完成时,它从队列中读取下一个项目并执行:

import time
import random
from multiprocessing import Process, Queue

# some random function which can have different execution time
def foo(a):
    print('foo', a)
    time.sleep(random.randint(1, 10) + 2)
    print(a)
    return 42

def readQueue(q):
    while True:
        item = q.get()
        if item:
            f,*args = item
            f(*args)
        else:
            return
    
if __name__ == '__main__':
    q = Queue()
    for a in range(4):  # create 4 jobs
        q.put((foo, a))
    for _ in range(3):  # sentinel for 3 processes
        q.put(None)

    # Start 3 processes
    p = []
    p.append(Process(target=readQueue, args=(q,)))
    p.append(Process(target=readQueue, args=(q,)))
    p.append(Process(target=readQueue, args=(q,)))

    for j in p:
        j.start()
    #time.sleep(10)
    for j in p:
        j.join()