我需要實現一個多處理池,利用任意包進行計算。爲此,我使用Python和joblib 0.9.0。這段代碼基本上是我想要的結構。Python多處理池功能沒有定義
import numpy as np
from joblib import pool
def someComputation(x):
return np.interp(x, [-1, 1], [-1, 1])
if __name__ == '__main__':
some_set_of_numbers = [-1,-0.5,0,0.5,1]
the_pool = pool.Pool(processes=2)
solutions = [the_pool.apply_async(someComputation, (x,)) for x in some_set_of_numbers]
print(solutions[0].get())
在Windows 10和Red Hat Enterprise Linux上運行蟒蛇4.3.1的Python 3.6.0(以及3.5和3.4虛擬ENVS),我得到的是 'NP' 從未傳遞到someComputation( )功能提高了錯誤
File "C:\Anaconda3\lib\site-packages\multiprocessing_on_dill\pool.py", line 608, in get
raise self._value
NameError: name 'np' is not defined
然而,在我的Mac OS X 10.11.6運行的Python 3.5和相同的JOBLIB,我得到完全相同的代碼預期輸出「-1」。 This問題本質上是一樣的,但它處理的是病態而不是joblib。一般的答案是包括功能
from joblib import pool
def someComputation(x):
import numpy as np
return np.interp(x, [-1, 1], [-1, 1])
if __name__ == '__main__':
some_set_of_numbers = [-1,-0.5,0,0.5,1]
the_pool = pool.Pool(processes=2)
solutions = [the_pool.apply_async(someComputation, (x,)) for x in some_set_of_numbers]
print(solutions[0].get())
這解決了在Windows和Linux機器的問題,他們現在輸出「-1」預期內的numpy的import語句,但這個解決方法看起來笨重。有什麼理由爲什麼第一個代碼可以在Mac上使用,但不能在Windows或Linux上使用?我最終需要在Linux機器上運行此代碼,因此是否有任何修復程序不包括將import語句放入函數中?
編輯:
調查遠一點後,我發現一箇舊的解決辦法我以前放在幾年,看起來就像是導致該問題。在JOBLIB/pool.py,我改變線44從
from multiprocessing.pool import Pool
到
from multiprocessing_on_dill.pool import Pool
支持的任意函數酸洗。出於某種原因,這種變化是真正導致Windows和Linux上的問題,但Mac機運行得很好。使用多處理而不是multiprocessing_on_dill可以解決上述問題,但由於不能進行酸洗,所以代碼對於大多數情況都不起作用。
不知道這是否回答你的問題,但比把函數導入更好的方法是將它聲明爲'def someComputation(x,np = np):'。在第一次解釋時,它應該將該模塊綁定到函數中的本地名稱,從而避免每次都需要運行導入機器。 –
這很好,我可以肯定地使用它,直到我們發現真正的問題。 –