Параллель python - joblib: повторное использование рабочих с оператором "with"
Я использую модуль Multiprocessing в JobLib. Я кодирую итеративный алгоритм, где мне нужно вызывать 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__
В другом сообщении о стеке потока ( Python Multiprocessing Lib Error (AttributeError: __exit__)) был ответ, в котором упоминалось, что для оператора with в Python 2.7 требуется менеджер контекста. Они предложили определить менеджер контекста, который оборачивается вокруг параллельного вызова. Я попробовал следующее:
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'
Кто-нибудь знает, как я могу правильно построить менеджер контекста для Parallel в Python 2.7?
1 ответ
Я считаю, что вы видите эту ошибку, потому что вы используете версию JobLib, которая не поддерживает этот синтаксис. Он был представлен в joblib 0.9, выпуск 14 октября 2015 года.