【发布时间】:2021-07-11 21:12:14
【问题描述】:
我正在编写经常需要使用 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
由于泡菜的原因而失败
Can't pickle <function test1 at 0x117473268>: it's not the same object as __main__.test1
我已经阅读了一些有关相关问题的帖子,但它们都实现了在装饰器之外执行多处理的解决方案。有谁知道如何实现这项工作?
【问题讨论】:
-
顺便说一句,这是一个比我看到的关于多处理的大多数问题要好得多的问题——经过深思熟虑,具有可靠的复制器,等等。
-
见What can multiprocessing and dill do together? -- 从
multiprocessing切换到第3 方pathos.multiprocessing,你就在那里。 -
你可以用“fork”试试这个还是你在 Windows 上?
-
您是否尝试过利用
copyreg? docs.python.org/3.7/library/copyreg.html functools 中还有 `partialmethod',虽然我不知道这是否是一个解决方案。 docs.python.org/3.7/library/functools.html -
“他们都实现了一个解决方案,在装饰器之外执行多处理。” >>你介意分享这些链接吗..(用于我/公共学习..)..tq..
标签: python multiprocessing python-multiprocessing