1

我在joblib中使用Multiprocessing模塊。我正在編寫一個迭代算法,我需要在每次迭代時調用Parallel。我懷疑我在這裏遭受了很多開銷,因爲我在每次通話時都會創建並摧毀一批工作人員。python - joblib並行:使用「with」語句重用工作

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__))有這樣提到的迴應是,在聲明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' 

有誰知道我怎麼能正確地在Python 2.7建立一個上下文管理器的並行?

回答

2

我相信你看到這個錯誤,因爲你正在使用一個不支持這種語法的joblib版本。它是在joblib 0.9中推出的,2015年10月14日發佈。

+0

謝謝,解決了這個問題!它在文檔中沒有提及它只是在最近的版本中。 – Adam