python 多進(jìn)程使用
問題描述
假設(shè):有個(gè)數(shù)據(jù)操作,處理100萬條數(shù)據(jù),每個(gè)數(shù)據(jù)的value+1。如簡(jiǎn)單代碼假設(shè)
for x in range(1,100): x++
從數(shù)據(jù)庫獲取100條了,然后想多進(jìn)程去執(zhí)行x++?還是說多進(jìn)程去數(shù)據(jù)庫獲取數(shù)據(jù)?謝謝了
問題解答
回答1:有一個(gè)問題: 如果是數(shù)據(jù)庫里面的數(shù)據(jù), 為什么不執(zhí)行sql,這比什么多進(jìn)程要高效的多吧?如果非要你給出的二選一, 那么考慮一下:
1). 如果你要用多進(jìn)程去數(shù)據(jù)庫獲取數(shù)據(jù)(就算你用了mysql連接池,可以不怎么考慮數(shù)據(jù)庫連接的io消耗),你每取一次數(shù)據(jù),總要有一次查詢吧, 完了以后,你還要把更新后的數(shù)據(jù)寫入到數(shù)據(jù)庫了, 又是一次數(shù)據(jù)庫操作,想想這個(gè)消耗有多大?2). 數(shù)據(jù)庫獲取100萬數(shù)據(jù),然后想多進(jìn)程去執(zhí)行x++; 這種情況啊,只要計(jì)算機(jī)內(nèi)存夠(只有100萬數(shù)據(jù),基本是沒問題的), 用python的進(jìn)程池map一下,確實(shí)也是沒什么問題回答2:
先將原始數(shù)據(jù)存入隊(duì)列(queue)中,作為生產(chǎn)者后從隊(duì)列中取數(shù)據(jù),執(zhí)行操作,作為消費(fèi)者這時(shí),可以在消費(fèi)者開多線程(當(dāng)然你鎖處理得好的話,生產(chǎn)者也可以做多線程)
while tmp_queue.empty() is not True: x = tmp_queue.get() x += 1
在隊(duì)列中,如果一直存在元素線程會(huì)持續(xù)進(jìn)行操作。
回答3:其實(shí)Python中實(shí)現(xiàn)多進(jìn)程的最佳方式是使用multiprocessing中的map
例子(Python 3):
# f.py# 要對(duì)某個(gè)列表中每個(gè)元素都執(zhí)行一次的functiondef f(x): return x + 1
# main.pyfrom multiprocessing import poolfrom f import f# 創(chuàng)建進(jìn)程池p = pool.Pool(4)lst = range(100)# 使用多進(jìn)程對(duì)整個(gè)列表進(jìn)行計(jì)算print(p.map(f, lst))回答4:
你可以直接把數(shù)據(jù)讀取和數(shù)據(jù)+1兩個(gè)函數(shù)再寫到一個(gè)操作中啊,然后用多進(jìn)程去操作,就上樓上說的一樣用進(jìn)程池進(jìn)行操作。根據(jù)你的cpu核數(shù),設(shè)置進(jìn)程池的大小。由于多進(jìn)程間不進(jìn)行內(nèi)存共享、也不能直接通信,你先用多進(jìn)程從數(shù)據(jù)庫中把所有數(shù)據(jù)讀出來,然后再用多進(jìn)程進(jìn)行val+1也行的
相關(guān)文章:
1. javascript - 循環(huán)嵌套多個(gè)promise應(yīng)該如何實(shí)現(xiàn)?2. mysql優(yōu)化 - 關(guān)于mysql分區(qū)3. css3 - rem布局下,用戶瀏覽器的最小字號(hào)是12px怎么辦?4. javascript - ionic2 input autofocus 電腦成功,iOS手機(jī)鍵盤不彈出5. html5 - 如何實(shí)現(xiàn)帶陰影的不規(guī)則容器?6. objective-c - iOS開發(fā)支付寶和微信支付完成為什么跳轉(zhuǎn)到了之前開發(fā)的一個(gè)app?7. 前端 - IE9 css兼容問題8. 請(qǐng)教各位大佬,瀏覽器點(diǎn) 提交實(shí)例為什么沒有反應(yīng)9. vue.js - vue 打包后 nginx 服務(wù)端API請(qǐng)求跨域問題無法解決。10. css - 移動(dòng)端字體設(shè)置問題
