2016-09-26 51 views
0

我試圖構建一個多處理腳本,它從MySQL表中檢索屬性的字典,然後在並行中運行我的主腳本實例,使用檢索到的每個字典從MySQL表中作爲參數傳遞給主腳本的每個實例。主腳本有一個名爲queen_bee()的方法,它負責確保所有其他方法都有正確的信息並按正確的順序執行。python 27 - 並行創建並運行另一個腳本的實例

我嘗試遍歷列表中的字典,以便使用多處理庫創建/運行主腳本的並行處理。但他們最終連續運行,而不是同時運行:

from my_main_script import my_main_class as main 
import multiprocessing as mp 

def create_list_of_attribute_dicts(): 
    ... 
    return list_of_dicts 

for each_dict in list_of_dicts: 
    instance = main(each_dict) 
    p = mp.Process(target=instance.queen_bee(),args=(each_dict,)) 
    p.start() 
    ... 

我也嘗試使用多處理庫的Pool.map()方法。但我無法弄清楚如何實例主要腳本一次使用Pool.map()每個字典:

... 
pool = mp.Pool() 
jobs = pool.map(main.queen_bee(),list_of_dicts) 

的Pool.map方法似乎是最清潔,最Python的方式來獲得這些實例並行運行,但在這種情況下,我掛斷了正確的方式。我知道上面的'jobs'變量會失敗,因爲'main'沒有被實例化。然而,我不知道如何將每個字典作爲參數傳遞給主類的不同實例,然後使用map方法運行這些實例。我願意嘗試不同的方法。在此先感謝您的幫助。

回答

0

我想我有它舔。答案似乎是使用Pool的map函數調用一個內的工作函數,該函數在之內,是同一個多處理腳本。工作者函數然後實例化調用它自己的工作者函數的主腳本(在這種情況下爲'queen_bee')。

使用我的代碼示例從上面:

from my_main_script import my_main_class as main 
import multiprocessing as mp 

def create_list_of_active_job_attribute_dicts(): 
    ... 
    return active_jobs 

def call_the_queen(individual_active_job): 
    instance = main(individual_active_job) 
    instance.queen_bee() 

if __name__ == '__main__': 
    pool = mp.Pool(processes = 4) 
    pool.map(call_the_queen,active_jobs) 
    pool.close() 
    pool.join() 

我不知道爲什麼工作方式,另一個沒有。如果有人想要權衡並解釋,我將不勝感激。謝謝@coder的幫助!

相關問題