2017-04-10 78 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]))