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