python开多少进程合适_用了python多进程,我跑程序花费的时间缩短了4倍
應(yīng)用場(chǎng)景:本人需要對(duì)200萬(wàn)條網(wǎng)頁(yè)html格式數(shù)據(jù)進(jìn)行清洗,提取文字后將分詞結(jié)果寫(xiě)入數(shù)據(jù)庫(kù),之前做了一次,大概花費(fèi)了80多個(gè)小時(shí)才跑完。機(jī)器配置是4核,內(nèi)存8G;開(kāi)完會(huì)領(lǐng)導(dǎo)讓再改點(diǎn)東西重新跑一遍,然后說(shuō)用多進(jìn)程或者多線(xiàn)程跑,速度快。
本人接觸python不到兩個(gè)月,以前也基本不怎么編程,所以這種優(yōu)化什么的東西都不懂,只好求助同事。同事告訴我直接看廖雪峰的教程就ok了。先看了一下廖雪峰寫(xiě)的單個(gè)進(jìn)程代碼,比較容易懂,但是我需要開(kāi)四個(gè)進(jìn)程,把我的cpu都占滿(mǎn)來(lái)跑,這樣效率才最大。
所以又看了多進(jìn)程的例子,并自己實(shí)踐了一下:
from multiprocessing importProcessimportosfrom multiprocessing importPooldefrun_proc(i):
a=i*3
print(a)if __name__=='__main__':
p= Pool(4)for i in range(5):
p.apply_async(run_proc, args=(i,))
p.close()
p.join()
看一下上面代碼,Pool代表的是一個(gè)進(jìn)程池,里面寫(xiě)幾就代表你想跑幾個(gè)進(jìn)程,但是你的cpu是幾核你就只能開(kāi)幾個(gè)進(jìn)程,而且進(jìn)程數(shù)最好是2的整數(shù)倍(同事告訴我的)。查看cpu核數(shù)的方法就是打開(kāi)任務(wù)管理器,然后性能里面有幾個(gè)小窗口就代表幾核。
我的是四個(gè)小窗口,代表四核。按照上面的例子我用四個(gè)核來(lái)計(jì)算run_proc這個(gè)函數(shù),然后每個(gè)核計(jì)算的是一個(gè)i值對(duì)應(yīng)的run_proc函數(shù)。
接下來(lái)到我的實(shí)際場(chǎng)景中,我是想從數(shù)據(jù)庫(kù)中讀取200萬(wàn)條數(shù)據(jù)并對(duì)所有數(shù)據(jù)進(jìn)行一系列操作后再寫(xiě)如數(shù)據(jù)庫(kù),這里我采用四核全跑,每個(gè)核分配50萬(wàn)數(shù)據(jù)來(lái)進(jìn)行:
start =datetime.datetime.now()
p= Pool(4) #建立進(jìn)程池
get_data_cmd=['SELECT * FROM 標(biāo)訊樣本_二百萬(wàn) limit 0,500000','SELECT * FROM 標(biāo)訊樣本_二百萬(wàn) limit 500000,500000','SELECT * FROM 標(biāo)訊樣本_二百萬(wàn) limit 1000000,500000','SELECT * FROM 標(biāo)訊樣本_二百萬(wàn) limit 1500000,500000']for cmd in get_data_cmd: #將每個(gè)命令傳入不同的子進(jìn)程執(zhí)行相同的代碼
p.apply_async(con_seg_word, args=(cmd,))
p.close()
p.join()
我的方法比較笨,就是將四個(gè)不同的sql命令放在一個(gè)列表中,然后循環(huán)讀取列表中的語(yǔ)句來(lái)分配給每個(gè)核要跑的函數(shù),這樣就ok了,時(shí)間大約比之前少了4倍吧。
apply_async這個(gè)方法就是你要將你的這四個(gè)sql命令給哪個(gè)函數(shù),其中arg就是要傳遞進(jìn)函數(shù)的參數(shù)。
PS:這個(gè)多進(jìn)程的方法其實(shí)有很多隱藏的問(wèn)題在里面的,例如針對(duì)limit這個(gè)問(wèn)題,后面會(huì)越來(lái)越慢,因?yàn)閘imit相當(dāng)于全表進(jìn)行過(guò)濾,因此不推薦此種方式;
另外在innodb這種引擎數(shù)據(jù)庫(kù)中,當(dāng)limit幾千萬(wàn)數(shù)據(jù)后面的數(shù)據(jù)時(shí)候會(huì)報(bào)錯(cuò),(the totle number of locks exceeds the lock table size),這是因?yàn)镮nnoDB表執(zhí)行大批量數(shù)據(jù)的更新,插入,刪除操作時(shí)會(huì)出現(xiàn)這個(gè)問(wèn)題,需要調(diào)整InnoDB全局的innodb_buffer_pool_size的值來(lái)解決這個(gè)問(wèn)題,并且重啟mysql服務(wù)。
這里還需要進(jìn)一步來(lái)探索多進(jìn)程的內(nèi)部機(jī)制從而來(lái)寫(xiě)一個(gè)更好的多進(jìn)程栗子。
總結(jié)
以上是生活随笔為你收集整理的python开多少进程合适_用了python多进程,我跑程序花费的时间缩短了4倍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python import_Python
- 下一篇: python的所有数据类型都可以相互转化