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 值,而不是函数。
相反,函数的参数应该通过 args
或 kwargs
参数传递给 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)
)
我有一些 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 值,而不是函数。
相反,函数的参数应该通过 args
或 kwargs
参数传递给 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)
)