如何 运行 python 中的函数与相同的参数并行?
How to run a function in python in parallel with the same arguments?
当参数相同时,如何运行并行处理多个独立进程?我当前(不太好)的解决方案是:
import time
import multiprocessing
def parse_args():
...
return args
def my_function(args):
...
if __name__ == '__main__':
args = parse_args()
processes = []
for i in range(5):
processes.append(multiprocessing.Process(target=my_function, args=(args,)))
processes[-1].start()
time.sleep(200)
for i in range(5):
processes[i].terminate()
此外,my_function
运行 无限期并且 return 什么都没有。
如本例所示,只需使用线程
import threading as thd
def function_one():
while True:
print("alice")
def function_two():
while True:
print("bob")
first_thd = thd.Thread(target=function_one)
second_thd = thd.Thread(target=function_two)
first_thd.start()
second_thd.start()
可以同时调用多个线程
我会加入他们,并确保他们自行终止,就像这样:
processes = [Process(target=my_function, args=(args,), daemon=True) for p in range(nb_processes)] # create nb_processes running my_function
[p.start() for p in processes] # start all processes
[p.join() for p in processes] # wait for all processes to end
您要确保 my_function
实施某种超时,因为这将等待所有进程完成。
至于取回他们的结果,您可以使用队列、检查 multiprocessing.Queue 或消息代理。我个人喜欢为此使用 REDIS,但它非常注重意见。
附带说明一下,如果您还没有看过 asyncio,您可能想看看。
使用进程池并使用 itertools 之类的工具映射您的调用,以使其简短而有趣。
import multiprocessing
import itertools
num_processes = 5
with multiprocessing.Pool(num_processes) as pool:
pool.map_async(my_function, itertools.repeat(args, num_processes))
time.sleep(200)
pool.terminate()
注意:map_async
returns 一个未来对象,如果您需要结果,可以调用 .get()
。
当参数相同时,如何运行并行处理多个独立进程?我当前(不太好)的解决方案是:
import time
import multiprocessing
def parse_args():
...
return args
def my_function(args):
...
if __name__ == '__main__':
args = parse_args()
processes = []
for i in range(5):
processes.append(multiprocessing.Process(target=my_function, args=(args,)))
processes[-1].start()
time.sleep(200)
for i in range(5):
processes[i].terminate()
此外,my_function
运行 无限期并且 return 什么都没有。
如本例所示,只需使用线程
import threading as thd
def function_one():
while True:
print("alice")
def function_two():
while True:
print("bob")
first_thd = thd.Thread(target=function_one)
second_thd = thd.Thread(target=function_two)
first_thd.start()
second_thd.start()
可以同时调用多个线程
我会加入他们,并确保他们自行终止,就像这样:
processes = [Process(target=my_function, args=(args,), daemon=True) for p in range(nb_processes)] # create nb_processes running my_function
[p.start() for p in processes] # start all processes
[p.join() for p in processes] # wait for all processes to end
您要确保 my_function
实施某种超时,因为这将等待所有进程完成。
至于取回他们的结果,您可以使用队列、检查 multiprocessing.Queue 或消息代理。我个人喜欢为此使用 REDIS,但它非常注重意见。
附带说明一下,如果您还没有看过 asyncio,您可能想看看。
使用进程池并使用 itertools 之类的工具映射您的调用,以使其简短而有趣。
import multiprocessing
import itertools
num_processes = 5
with multiprocessing.Pool(num_processes) as pool:
pool.map_async(my_function, itertools.repeat(args, num_processes))
time.sleep(200)
pool.terminate()
注意:map_async
returns 一个未来对象,如果您需要结果,可以调用 .get()
。