假設(shè):有個數(shù)據(jù)操作,處理100萬條數(shù)據(jù),每個數(shù)據(jù)的value+1。
如簡單代碼假設(shè)
for x in range(1,100):
x++
從數(shù)據(jù)庫獲取100條了,然后想多進程去執(zhí)行x++?
還是說多進程去數(shù)據(jù)庫獲取數(shù)據(jù)?
謝謝了
業(yè)精于勤,荒于嬉;行成于思,毀于隨。
有一個問題: 如果是資料庫裡面的資料, 為什麼不執(zhí)行sql,這比什麼多進程要高效的多吧?
如果非要你給出的二選一, 那麼考慮一下:
1). 如果你要用多進程去數(shù)據(jù)庫獲取數(shù)據(jù)(就算你用了mysql連接池,可以不怎么考慮數(shù)據(jù)庫連接的io消耗),
你每取一次數(shù)據(jù),總要有一次查詢吧, 完了以后,你還要把更新后的數(shù)據(jù)寫入到數(shù)據(jù)庫了, 又是一次數(shù)據(jù)庫操作,
想想這個消耗有多大?
2). 數(shù)據(jù)庫獲取100萬數(shù)據(jù),然后想多進程去執(zhí)行x++; 這種情況啊,只要計算機內(nèi)存夠(只有100萬數(shù)據(jù),基本是沒問題的), 用python的進程池map一下,確實也是沒什么問題
先將原始數(shù)據(jù)存入隊列(queue)中,作為生產(chǎn)者
後從隊列中取數(shù)據(jù),執(zhí)行操作,作為消費者
這時,可以在消費者開多線程(當(dāng)然你鎖處理得好的話,生產(chǎn)者也可以做多執(zhí)行緒)
while tmp_queue.empty() is not True:
x = tmp_queue.get()
x += 1
在佇列中,如果一直存在元素執(zhí)行緒會持續(xù)進行操作。
其實Python中實現(xiàn)多進程的最佳方式是使用multiprocessing
中的map
範(fàn)例(Python 3):
# f.py
# 要對某個列表中每個元素都執(zhí)行一次的function
def f(x):
return x + 1
# main.py
from multiprocessing import pool
from f import f
# 創(chuàng)建進程池
p = pool.Pool(4)
lst = range(100)
# 使用多進程對整個列表進行計算
print(p.map(f, lst))
你可以直接把資料讀取和資料+1兩個函數(shù)再寫到一個操作中啊,然後用多進程去操作,就上樓上說的一樣用進程池進行操作。根據(jù)你的cpu核數(shù),設(shè)定進程池的大小。由於多進程間不進行記憶體共享、也不能直接通信,你先用多進程從資料庫中把所有資料讀出來,然後再用多進程進行val+1也行的