我在 joblib 中使用 Multiprocessing 模块。我正在编写一个迭代算法,我需要在每次迭代时调用 Parallel 。我怀疑我在这里承受了很多开销,因为我在每次调用时都会创建和销毁一个工人池。
joblib 文档对此案例有参考。但是,该解决方案似乎不适用于 Python 2.7:
with Parallel(n_jobs=2) as parallel:
accumulator = 0.
n_iter = 0
while accumulator < 1000:
results = parallel(delayed(sqrt)(accumulator + i ** 2) for i in range(5))
accumulator += sum(results) # synchronization barrier
n_iter += 1
这会产生错误消息:
AttributeError: __exit__
另一个 stackoverflow 帖子(Python Multiprocessing Lib Error (AttributeError: __exit__))的响应提到 Python 2.7 中的 with 语句需要上下文管理器。他们建议定义一个包含 Parallel 调用的上下文管理器。我尝试了以下方法:
from contextlib import contextmanager, closing
@contextmanager
def terminating(fn):
try:
yield fn
finally:
fn.terminate()
with terminating(Parallel(n_jobs=2)) as parallel:
accumulator = 0.
n_iter = 0
while accumulator < 1000:
results = parallel(delayed(sqrt)(accumulator + i ** 2) for i in range(5))
accumulator += sum(results) # synchronization barrier
n_iter += 1
但是,我收到以下错误消息:
AttributeError: 'Parallel' object has no attribute 'terminate'
有人知道我如何在 Python 2.7 中为 Parallel 正确构建上下文管理器吗?