python 多進程使用
問題描述
假設:有個數據操作,處理100萬條數據,每個數據的value+1。如簡單代碼假設
for x in range(1,100): x++
從數據庫獲取100條了,然后想多進程去執行x++?還是說多進程去數據庫獲取數據?謝謝了
問題解答
回答1:有一個問題: 如果是數據庫里面的數據, 為什么不執行sql,這比什么多進程要高效的多吧?如果非要你給出的二選一, 那么考慮一下:
1). 如果你要用多進程去數據庫獲取數據(就算你用了mysql連接池,可以不怎么考慮數據庫連接的io消耗),你每取一次數據,總要有一次查詢吧, 完了以后,你還要把更新后的數據寫入到數據庫了, 又是一次數據庫操作,想想這個消耗有多大?2). 數據庫獲取100萬數據,然后想多進程去執行x++; 這種情況啊,只要計算機內存夠(只有100萬數據,基本是沒問題的), 用python的進程池map一下,確實也是沒什么問題回答2:
先將原始數據存入隊列(queue)中,作為生產者后從隊列中取數據,執行操作,作為消費者這時,可以在消費者開多線程(當然你鎖處理得好的話,生產者也可以做多線程)
while tmp_queue.empty() is not True: x = tmp_queue.get() x += 1
在隊列中,如果一直存在元素線程會持續進行操作。
回答3:其實Python中實現多進程的最佳方式是使用multiprocessing中的map
例子(Python 3):
# f.py# 要對某個列表中每個元素都執行一次的functiondef f(x): return x + 1
# main.pyfrom multiprocessing import poolfrom f import f# 創建進程池p = pool.Pool(4)lst = range(100)# 使用多進程對整個列表進行計算print(p.map(f, lst))回答4:
你可以直接把數據讀取和數據+1兩個函數再寫到一個操作中啊,然后用多進程去操作,就上樓上說的一樣用進程池進行操作。根據你的cpu核數,設置進程池的大小。由于多進程間不進行內存共享、也不能直接通信,你先用多進程從數據庫中把所有數據讀出來,然后再用多進程進行val+1也行的
相關文章:
1. angular.js - react的redux和vue的vuex,angular呢2. javascript - js 寫一個正則 提取文本中的數據3. c++ - 如何正確的使用QWebEngineView?4. javascript - 關于Lazyload遇到的問題5. 算法 - python 給定一個正整數a和一個包含任意個正整數的 列表 b,求所有<=a 的加法組合6. yii2中restful配置好后在nginx下報404錯誤7. WEB-INF / classes /與WEB-INF / lib / *。jar在類路徑優先級?8. java題目 任意一個字符串 倒置輸出,保持單詞的完整性9. java - 我在用Struts2上傳文件時,報以下錯誤怎么回事?10. javascript - 游戲里物體角色層次渲染邏輯和代碼怎么寫才好?
