假设:有个数据操作,处理100万条数据,每个数据的value+1。如简单代码假设
for x in range(1,100): x++
从数据库获取100条了,然后想多进程去执行x++?还是说多进程去数据库获取数据?谢谢了
业精于勤,荒于嬉;行成于思,毁于随。
有一個問題: 如果是資料庫裡面的資料, 為什麼不執行sql,這比什麼多進程要高效的多吧?如果非要你給出的二選一, 那麼考慮一下:
1). 如果你要用多进程去数据库获取数据(就算你用了mysql连接池,可以不怎么考虑数据库连接的io消耗), 你每取一次数据,总要有一次查询吧, 完了以后,你还要把更新后的数据写入到数据库了, 又是一次数据库操作, 想想这个消耗有多大? 2). 数据库获取100万数据,然后想多进程去执行x++; 这种情况啊,只要计算机内存够(只有100万数据,基本是没问题的), 用python的进程池map一下,确实也是没什么问题
先將原始數據存入隊列(queue)中,作為生產者後從隊列中取數據,執行操作,作為消費者這時,可以在消費者開多線程(當然你鎖處理得好的話,生產者也可以做多執行緒)
while tmp_queue.empty() is not True: x = tmp_queue.get() x += 1
在佇列中,如果一直存在元素執行緒會持續進行操作。
其實Python中實現多進程的最佳方式是使用multiprocessing中的map
multiprocessing
map
範例(Python 3):
# f.py # 要对某个列表中每个元素都执行一次的function def f(x): return x + 1
# main.py from multiprocessing import pool from f import f # 创建进程池 p = pool.Pool(4) lst = range(100) # 使用多进程对整个列表进行计算 print(p.map(f, lst))
你可以直接把資料讀取和資料+1兩個函數再寫到一個操作中啊,然後用多進程去操作,就上樓上說的一樣用進程池進行操作。根據你的cpu核數,設定進程池的大小。由於多進程間不進行記憶體共享、也不能直接通信,你先用多進程從資料庫中把所有資料讀出來,然後再用多進程進行val+1也行的
有一個問題: 如果是資料庫裡面的資料, 為什麼不執行sql,這比什麼多進程要高效的多吧?
如果非要你給出的二選一, 那麼考慮一下:
先將原始數據存入隊列(queue)中,作為生產者
後從隊列中取數據,執行操作,作為消費者
這時,可以在消費者開多線程(當然你鎖處理得好的話,生產者也可以做多執行緒)
在佇列中,如果一直存在元素執行緒會持續進行操作。
其實Python中實現多進程的最佳方式是使用
multiprocessing
中的map
範例(Python 3):
你可以直接把資料讀取和資料+1兩個函數再寫到一個操作中啊,然後用多進程去操作,就上樓上說的一樣用進程池進行操作。根據你的cpu核數,設定進程池的大小。由於多進程間不進行記憶體共享、也不能直接通信,你先用多進程從資料庫中把所有資料讀出來,然後再用多進程進行val+1也行的