最近打比賽,apply操作極慢,隊友使用了線程池,用多核開辟多線程跑,加速。
在阿里平台上,都沒問題。
我是win10系統+jupyter notebook
多線程那個模塊運行,會顯示一直運行,p.close()會被卡死
from multiprocessing import Pool def df_cut_word(data, c): data[c] = data[c].map(lambda x: ' '.join(jieba.cut(x))) return data[[c]] processor = 12 list_seg = ["prefix", "title", "text0", "text1", "text2", "text3", "text4", "text5", "text6", "text7", "text8", "text9"] cut_word_args = list_seg p = Pool(processor) res = [] for i in range(len(cut_word_args)): print(cut_word_args[i]) res.append( p.apply_async(df_cut_word, args=( data[[cut_word_args[i]]], cut_word_args[i])) ) print(str(i) + ' processor started !') p.close() p.join() res = [item.get() for item in res] res = pd.concat(res, axis=1) print(res.columns) data = data[[c for c in data.columns if c not in res.columns]] data = pd.concat([data, res], axis=1)
這是linux的寫法
在Windows上要想使用進程模塊,就必須把有關進程的代碼寫在當前.py文件的if __name__ == ‘__main__’ :語句的下面,才能正常使用Windows下的進程模塊。Unix/Linux下則不需要。
改為:
from multiprocessing import Pool def df_cut_word(data, c): data[c] = data[c].map(lambda x: ' '.join(jieba.cut(x))) return data[[c]] list_seg = ["prefix", "title", "text0", "text1", "text2", "text3", "text4", "text5", "text6", "text7", "text8", "text9"] if __name__=='__main__': processor = 2 cut_word_args = list_seg p = Pool(processor) res = [] for i in range(len(cut_word_args)): print(cut_word_args[i]) res.append( p.apply_async(df_cut_word, args=( data[[cut_word_args[i]]], cut_word_args[i])) ) print(str(i) + ' processor started !') print('ok') p.close() p.join()
然而還是不行,后來搜到了
在Windows環境中,jupyter-notebook中,即使使用if __name__ == '__main__進行保護,也會出現runtime error,這個時候可以將jupyter中的代碼下載成py腳本,直接運行腳本。
作為對比,Linux下運行的jupyter-notebook並不會。