如何并行启动功能,检查它们是否完成,并在 python 中启动一个新功能?
How to start functions in parallel, check if they are done, and start a new function in python?
我想编写一个 python 代码来执行以下操作:
- 首先,它并行启动,比如说,3 个进程(或线程,或其他)。
- 然后在循环中,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()
我想编写一个 python 代码来执行以下操作:
- 首先,它并行启动,比如说,3 个进程(或线程,或其他)。
- 然后在循环中,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()