在看代碼時遇到了這個語句:self._worker_pool= Pool(processes=num_workers)
轉(zhuǎn)載:https://blog.csdn.net/jinping_shi/article/details/52433867?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
問題起因
最近要將一個文本分割成好幾個topic降狠,每個topic設計一個regressor芥备,各regressor是相互獨立的轮蜕,最后匯總所有topic的regressor得到總得預測結(jié)果。沒錯!類似bagging ensemble竖哩!只是我沒有抽樣椅贱。文本不大慌洪,大概3000行,topic個數(shù)為8穗慕,于是我寫了一個串行的程序饿敲,一個topic算完之后再算另一個topic」涿啵可是我在每個topic中用了GridSearchCV來調(diào)參怀各,又要選特征又要調(diào)整regressor的參數(shù),導致參數(shù)組合一共有1782種术浪。我真是低估了調(diào)參的時間瓢对,程序跑了一天一夜最后因為忘記import一個庫導致最終的預測精度沒有算出來。后來想到胰苏,既然每個topic的預測都是獨立的硕蛹,那是不是可以并行呢?
Python中的多線程與多進程:multiprocessing
但是聽聞Python的多線程實際上并不能真正利用多核硕并,所以如果使用多線程實際上還是在一個核上做并發(fā)處理法焰。不過,如果使用多進程就可以真正利用多核鲤孵,因為各進程之間是相互獨立的壶栋,不共享資源,可以在不同的核上執(zhí)行不同的進程普监,達到并行的效果贵试。同時在我的問題中,各topic相互獨立凯正,不涉及進程間的通信毙玻,只需最后匯總結(jié)果,因此使用多進程是個不錯的選擇廊散。
一個子進程
multiprocessing模塊提供process類實現(xiàn)新建進程桑滩。下述代碼是新建一個子進程。
上述代碼中p.join()的意思是等待子進程結(jié)束后才執(zhí)行后續(xù)的操作允睹,一般用于進程間通信运准。例如有一個讀進程pw和一個寫進程pr,在調(diào)用pw之前需要先寫pr.join()缭受,表示等待寫進程結(jié)束之后才開始執(zhí)行讀進程胁澳。
多個子進程
如果要同時創(chuàng)建多個子進程可以使用multiprocessing.Pool類。該類可以創(chuàng)建一個進程池米者,然后在多個核上執(zhí)行這些進程韭畸。
輸出結(jié)果如下:
上述代碼中的pool.apply_async()是apply()函數(shù)的變體宇智,apply_async()是apply()的并行版本,apply()是apply_async()的阻塞版本胰丁,使用apply()主進程會被阻塞直到函數(shù)執(zhí)行結(jié)束随橘,所以說是阻塞版本。apply()既是Pool的方法锦庸,也是Python內(nèi)置的函數(shù)机蔗,兩者等價∷嵩保可以看到輸出結(jié)果并不是按照代碼for循環(huán)中的順序輸出的蜒车。
多個子進程并返回值
apply_async()本身就可以返回被進程調(diào)用的函數(shù)的返回值。上一個創(chuàng)建多個子進程的代碼中幔嗦,如果在函數(shù)func中返回一個值酿愧,那么pool.apply_async(func, (msg, ))的結(jié)果就是返回pool中所有進程的值的對象(注意是對象,不是值本身)邀泉。
這里還有個參考博客:https://blog.csdn.net/weixin_37111106/article/details/85122988