我正在嘗試使用多進程池對象。我希望每個進程在啓動時都打開數據庫連接,然後使用該連接來處理傳入的數據(而不是打開和關閉每個數據位的連接)。這似乎是初始化程序的作用因爲,但我無法圍繞工作人員和初始化程序如何溝通。所以我有這樣的事情:如何使用初始化設置我的多進程池?
def get_cursor():
return psycopg2.connect(...).cursor()
def process_data(data):
# here I'd like to have the cursor so that I can do things with the data
if __name__ == "__main__":
pool = Pool(initializer=get_cursor, initargs=())
pool.map(process_data, get_some_data_iterator())
我怎麼(或我)從get_cursor()返回光標到process_data()?
這應該是接受的答案 – thias 2014-01-15 14:12:32
@torek應該在init_worker中調用set_global_cursor嗎? – 2015-06-13 07:06:51
@TheUnfunCat:不知道'init_worker'是什麼(我在你的答案中看到一個,但在原始問題中沒有)我不能確定地說。總的想法是允許'多進程。Pool「創建一個進程池,並讓每個進程創建(它自己的私有副本)數據庫連接。如果你想在池進程啓動時發生這種情況,你可以使用初始化函數。如果您希望稍後發生,可以稍後再做。無論哪種方式,你需要一個持久變量,就像你的方法中的'function.cursor'或普通的'global'一樣。 – torek 2015-06-14 00:40:39