2017-09-17 32 views
0

以下代碼未按預期執行。多處理池不能在嵌套函數中工作

import multiprocessing 

lock = multiprocessing.Lock() 
def dummy(): 
    def log_results_l1(results): 
     lock.acquire() 
     print("Writing results", results) 
     lock.release() 

    def mp_execute_instance_l1(cmd): 
     print(cmd) 
     return cmd 

    cmds = [x for x in range(10)] 

    pool = multiprocessing.Pool(processes=8) 

    for c in cmds: 
     pool.apply_async(mp_execute_instance_l1, args=(c,), callback=log_results_l1) 

    pool.close() 
    pool.join() 
    print("done") 


dummy() 

但是,如果功能沒有嵌套,它確實有效。到底是怎麼回事。

+0

'lock'的類型是什麼? –

+0

對於將來,雖然你的問題從上下文來看是足夠明顯的,但你不能說「它不工作」。您需要提供[MCVE],在這種情況下,將包含發生故障時的錯誤和異常追溯。 – ShadowRanger

+0

是的,謝謝。 – kanna

回答

1

multiprocessing必須醃製函數和參數。函數被他們的合格名稱醃製;實質上,在取消打印時,另一個進程需要能夠導入定義的模塊,並執行getattr調用來查找有問題的函數。嵌套函數在其定義的函數外部不能通過名稱獲得,因此酸洗失敗。當你將這個功能移到全局範圍時,你可以修復這個問題,這就是爲什麼當你這樣做的時候。