Python:带参数的多处理函数

Python: Multiprocessing functions with parameters

我有一些 python 函数可以从远程主机读取文件并处理它们的内容。我已经将所有这些功能放在 python 文件中到 运行。但问题是每个函数都不会开始 运行 直到前一个函数完成它的工作,这会花费不必要的时间。我考虑过 运行ning 并行函数,所以 google 并发现有趣的解决方案包括 multiprocessing

我已经尝试过接受的答案:

Python: How can I run python functions in parallel?

from multiprocessing import Process

def func1():
   print('func1: starting')
   for i in range(10000000): pass
   print('func1: finishing')

def func2():
   print('func2: starting')
   for i in range(10000000): pass
   print('func2: finishing')

def runInParallel(*fns):
   proc = []
   for fn in fns:
      p = Process(target=fn)
      p.start()
      proc.append(p)
   for p in proc:
      p.join()

if __name__ == '__main__':
   runInParallel(func1, func2)

它工作并给出这个输出:

$ python multi-process.py
func1: starting
func2: starting
func2: finishing
func1: finishing

但是我需要给函数传递参数。所以我把示例代码改成了:

def func1(a): 
   ......

def func2(b):
   ......

if __name__ == '__main__':
   runInParallel(func1(1), func2(2))

但输出变为:

$ python multi-process.py 
func1: starting
func1: finishing
func2: starting
func2: finishing

并且这些函数不会 运行 以并行方式。

不知道为什么。

runInParallel(func1(1), func2(2)) 实际上调用函数(同步地,在当前进程中)并将 runInParallel 应用于它们的 return 值,而不是函数。

相反,函数的参数应该通过 argskwargs 参数传递给 Process(target=fcn, ...),例如通过修改 runInParallel 来接受 (function, function args, function kwargs) 的元组,像这样:

def runInParallel(*fns_params):
   proc = []
   for fn, fn_args, fn_kwargs in fns_params:
      p = Process(target=fn, args=fn_args, kwargs=fn_kwargs)
      p.start()
      proc.append(p)
   for p in proc:
      p.join()

if __name__ == '__main__':
   runInParallel(
      (func1, ('positional', 'argument', 'values'), {'name': 'value', 'argument': 'pairs'}), 
      (func2, func2_args, func2_kwargs)
   )