grupo de multiprocesamiento no funciona en funciones anidadas

Siguiendo el código no se ejecuta como se esperaba.

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

Pero funciona si las funciones no están anidadas. Que esta pasando.

multiprocessing tiene que decapar tanto la función como los argumentos. Las funciones son decapadas por su nombre calificado; Básicamente, al descomprimir, el otro proceso debe poder importar el módulo en el que se definieron y hacer una llamada getattr para encontrar la función en cuestión. Las funciones anidadas no están disponibles por nombre fuera de la función en la que se definieron, por lo que el decapado falla. Cuando mueves la función al scope global, arreglas esto, por lo que funciona cuando lo haces.