我正在使用 Windows 機器,并且我有一個為 Python 2.7 設計的代碼,可以解決統計模型。由于模型取決于參數的值,因此我創建了一個并行版本,它為每個參數值求解一個模型。例如,考慮一個名為的第一個文件main_function,其中包含以下代碼(此代碼是為了可復制性,但與問題無關):import numpy as npimport cvxpydef lm_lasso(x, y, lambda1=None): n = x.shape[0] m = x.shape[1] lambda_param = cvxpy.Parameter(sign="positive") # Define the objective function beta_var = cvxpy.Variable(m) lasso_penalization = lambda_param * cvxpy.norm(beta_var, 1) lm_penalization = (1.0 / n) * cvxpy.sum_squares(y - x * beta_var) objective = cvxpy.Minimize(lm_penalization + lasso_penalization) problem = cvxpy.Problem(objective) beta_sol_list = [] for l in lambda1: lambda_param.value = l problem.solve(solver=cvxpy.ECOS) beta_sol = np.asarray(np.row_stack([b.value for b in beta_var])).flatten() beta_sol_list.append(beta_sol) return beta_sol_list第二個名為的文件parallel_function包含以下代碼:import multiprocessing as mpimport numpy as npimport functoolsimport zz_main_function as mfdef lm_lasso_parallel(x, y, lambda1): chunks = np.array_split(lambda1, mp.cpu_count()) pool = mp.Pool(processes=mp.cpu_count()) results = pool.map(functools.partial(mf.lm_lasso, x, y), chunks) pool.close() pool.join() return results我將函數拆分為兩個文件的原因是因為這樣一切似乎都可以正常工作,而無需添加if __name__ == '__main__':處理多處理時通常所需的內容。這段代碼是幾個月前編寫的,無論是從 python 控制臺還是運行 python 文件,都可以完美運行,例如:import zz_parallel_function as pffrom sklearn.datasets import load_bostonboston = load_boston()x = boston.datay = boston.targetlambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]r_parallel = pf.lm_lasso_parallel(x, y, lambda1)最近我不得不格式化我的電腦,當我重新安裝 python 2.7 并嘗試運行之前描述的代碼時,我遇到了以下錯誤:如果我嘗試直接從 python 控制臺運行它:import zz_parallel_function as pffrom sklearn.datasets import load_bostonboston = load_boston()x = boston.datay = boston.targetlambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]r_parallel = pf.lm_lasso_parallel(x, y, lambda1)如果我將其作為獨立文件運行:所以我的問題是:為什么這段代碼以前有效,現在無效?(可能)唯一改變的是安裝的一些模塊的版本,但我認為這無關緊要關于如何讓它再次工作的任何猜測?
1 回答

一只萌萌小番薯
TA貢獻1795條經驗 獲得超7個贊
您不能mulitprocessing
直接從 python 解釋器生成新的子進程。
從文檔中,
注意:此包中的功能要求 子模塊可以導入主模塊。這在編程指南中有介紹,但值得在這里指出。這意味著某些示例,例如 Pool 示例將無法在交互式解釋器中工作。
指導方針說
安全導入主模塊
確保新的 Python 解釋器可以安全地導入主模塊,而不會導致意外的副作用(例如啟動新進程)。
在 Windows 以外的任何操作系統上調用時,調用 freeze_support() 均無效。另外,如果模塊在 Windows 上被 Python 解釋器正常運行(程序沒有被凍結),則 freeze_support() 無效。
此外,應使用if __name__ == '__main__':
以下方式保護程序的“入口點”:
from multiprocessing import Process, freeze_support
def f():
print 'hello world!'
if __name__ == '__main__':
freeze_support()
Process(target=f).start()
如果freeze_support()省略該行,則嘗試運行凍結的可執行文件(例如,使用pyinstalleror創建py2exe)將引發RuntimeError。
添加回答
舉報
0/150
提交
取消