2

以下代码未按预期执行。

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()

但如果函数没有嵌套,它确实有效。到底是怎么回事。

4

1 回答 1

5

multiprocessing.Poolapply*和方法之类的*map*方法必须同时腌制函数和参数。函数按其限定名称腌制;本质上,在 unpickling 时,其他进程需要能够导入它们定义的模块并进行getattr调用以找到有问题的函数。嵌套函数在定义它们的函数之外按名称不可用,因此酸洗失败。当您将函数移动到全局范围时,您会修复它,这就是为什么它在您这样做时起作用的原因。

于 2017-09-17T17:23:10.187 回答