2017-09-17 33 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调用来查找有问题的函数。嵌套函数在其定义的函数外部不能通过名称获得,因此酸洗失败。当你将这个功能移到全局范围时,你可以修复这个问题,这就是为什么当你这样做的时候。