我正在处理一些与python的multiprocessing
Pool
类有关的代码。这导致了大量的代码像这样:
import time
from multiprocessing import Pool
from functools import partial
def test_func(x):
time.sleep(1)
return x
def test_func_parallel(iterable, processes):
p = Pool(processes=processes)
output = p.map(test_func, iterable)
p.close()
return output
这个可以更加通用:
def parallel(func, iterable, **kwargs):
func = partial(func, **kwargs)
p = Pool(processes=6)
out = p.map(func, iterable)
p.close()
return out
这样做虽然有效,但为每个其他函数添加一个并行包装器会使代码变得复杂。我真正想要的是将其作为修饰器运行。类似于这样:
def parallel(num_processes):
def parallel_decorator(func, num_processes=num_processes):
def parallel_wrapper(iterable, **kwargs):
func = partial(func, **kwargs)
p = Pool(processes=num_processes)
output = p.map(func, iterable)
p.close()
return output
return parallel_wrapper
return parallel_decorator
以下是该技术的使用方法:
@parallel(6)
def test_func(x):
time.sleep(1)
return x
由于pickle的原因,这种方法会失败。
无法将<function test1 at 0x117473268>加入到pickle中:它与__main__.test1不是同一个对象
我已经看过几篇相关问题的帖子,但它们都实现了在装饰器外执行多进程的解决方案。有人知道如何使这个方法能够工作吗?
pathos.multiprocessing
,你就可以实现了。 - Charles Duffycopyreg
吗?https://docs.python.org/3.7/library/copyreg.html 此外,functools中还有`partialmethod',但我不知道它是否是一个解决方案。https://docs.python.org/3.7/library/functools.html - Mark Moretto