日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python开多少进程合适_用了python多进程,我跑程序花费的时间缩短了4倍

發(fā)布時(shí)間:2025/3/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python开多少进程合适_用了python多进程,我跑程序花费的时间缩短了4倍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

應(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。