如何 运行 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()