2017-04-10 58 views
1

我有以下代碼:在python引入延遲多處理

from multiprocessing import Pool 
import pandas as pd 

def f(x): 
    data = pd.read_sql(query[x], conn) #query and conn are particular to my PC so no point in pasting it here 
    #do large math operations here 
    return answer 

if __name__ == '__main__': 
    p = Pool(5) 
    print(p.map(f, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) 

我有我的電腦上8個處理器。現在所有處理器同時通過conn訪問數據庫,這在數據庫端造成了一些問題。

如何更改上述代碼,以便一次只能訪問一個數據庫。當一個處理器訪問數據庫時,另一個處理器可以再次訪問數據庫。已經完成數據庫訪問的處理器應該繼續進行數學運算。基本上,我試圖確保數據庫訪問不是同時進行,但數據庫訪問代碼保留在多處理框架內。作爲最後的手段,我可​​以在處理它們之前嘗試讀取這些數據,但我正在查看是否可以在不更改現有代碼的情況下執行此操作。

+0

如果你想這樣做一次一個,然後去除多整點。而是讓每個進程都建立自己的連接。 – Vallentin

回答

1

保護訪問您的數據庫與multiprocessing.Lock

from multiprocessing import Pool, Lock 
import pandas as pd 

conn_lock = Lock() 

def f(x): 
    with conn_lock: 
     data = pd.read_sql(query[x], conn) 
    #do large math operations here 
    return answer 

if __name__ == '__main__': 
    p = Pool(5) 
    print(p.map(f, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))