我試圖讓我的代碼并行,但我遇到了一件我無法解釋的奇怪事情。讓我定義上下文。我有一個非常繁重的計算要做,讀取多個文件,對其進行機器學習分析,涉及很多數學。我的代碼按順序在 Windows 和 Linux 上正常運行,但是當我嘗試使用多處理時,一切都會中斷。下面是我首先在 Windows 上開發的示例:from multiprocessing.dummy import Pool as ThreadPool def ppp(element): window,day = element print(window,day) time.sleep(5) returnif __name__ == '__main__' #%% Reading datasets print('START') start_time = current_milli_time() tree = pd.read_csv('datan\\days.csv') days = list(tree.columns) # to be able to run this code uncomment the following line and comment the previous two # days = ['0808', '0810', '0812', '0813', '0814', '0817', '0818', '0827', '0828', '0829'] windows = [1000] processes_args = list(itertools.product(windows, days)) pool = ThreadPool(8) results = pool.map_async(ppp, processes_args) pool.close() pool.join() print('END', current_milli_time()-start_time, 'ms')當我在 Windows 上運行此代碼時,輸出如下所示:START100010001000 1000 1000100010001000 0810081208080813081408180827081710001000 08290828END 5036 ms125 毫秒內的一組亂七八糟的打印。在 Linux 上也有相同的行為。但是,我注意到,如果我在 Linux 上應用此方法,并查看“htop”,我看到的是一組隨機選擇執行的線程,但它們從不并行執行。因此,經過一些谷歌搜索后,我想出了這個新代碼:from multiprocessing import Pool as ProcessPooldef ppp(element): window,day = element print(window,day) time.sleep(5) return如您所見,我更改了導入語句,它基本上創建了一個進程池而不是線程池。這解決了 Linux 上的問題,實際上在真實場景中,我有 8 個處理器以 100% 運行,系統中有 8 個進程在運行。輸出看起來像以前的那樣。但是,當我在 Windows 上使用此代碼時,整個運行需要 10 多秒的時間,而且,我沒有得到任何ppp.我真的試圖尋找一個解釋,但我不明白為什么會這樣。例如這里:Windows 中的 Python 多處理池奇怪行為,他們討論了Windows 上的安全代碼,答案建議轉向線程,作為副作用,這將使代碼不是并行的,而是并發的。這里再舉一個例子:Python multiprocessing linux windows差異。所有這些問題都描述fork()和spawn處理,但我個人認為我的問題不是這樣。Python 文檔仍然解釋說 windows 沒有fork()方法(https://docs.python.org/2/library/multiprocessing.html#programming-guidelines)??傊?,現在我確信我不能在 Windows 中進行并行處理,但我認為我從所有這些討論中得出的結論是錯誤的。因此,我的問題應該是:是否可以在 Windows 中并行(在不同的 CPU 上)運行進程或線程?
添加回答
舉報
0/150
提交
取消