windows python的多進程


最近打比賽,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並不會。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM