¿Cómo ejecutar mapas de multiprocesamiento pathos jerárquicos anidados?

Después de construir una parte importante de mi código en la serialización / decapado de eneldo, también estoy tratando de usar el multiprocesamiento pathos para paralelizar mis cálculos. Pathos es una extensión natural del eneldo.

Al intentar ejecutar anidado

from pathos.multiprocessing import ProcessingPool
ProcessingPool().map(fn, args)

dentro de otroProcessingPool().map, entonces recibo:

AssertionError: daemonic processes are not allowed to have children

P.ej.:

from pathos.multiprocessing import ProcessingPool

def triple(x):
    return 3*x

def refork(x):
    from pathos.multiprocessing import ProcessingPool
    return ProcessingPool().map(triple, xrange(5))

ProcessingPool().map(refork, xrange(3))

rendimientos

AssertionError: daemonic processes are not allowed to have children

Traté de usaramap(...).get() sin éxito. Esto está en pathos 0.2.0.

¿Cuál es la mejor manera de permitir la paralelización anidada?

Actualizar

Tengo que ser honesto en este punto y confesar que he eliminado la afirmación."daemonic processes are not allowed to have children" de pathos. También construí algo que cae en cascadaKeyboardInterrupt a trabajadores y trabajadores de esos ... Partes de la solución a continuación:

def run_parallel(exec_func, exec_args, num_workers_i)
    pool = ProcessingPool(num_workers_i)
    pool.restart(force=True)
    pid_is = pool.map(get_pid_i, xrange(num_workers_i))
    try:
        results = pool.amap(
            exec_func,
            exec_args,
        )
        counter_i = 0
        while not results.ready():
            sleep(2)
            if counter_i % 60 == 0:
                print('Waiting for children running in pool.amap() with PIDs: {}'.format(pid_is))
            counter_i += 1
        results = results.get()
        pool.close()
        pool.join()
    except KeyboardInterrupt:
        print('Ctrl+C received, attempting to terminate pool...')
        hard_kill_pool(pid_is, pool)  # sending Ctrl+C
        raise
    except:
        print('Attempting to close parallel after exception: {}'.format(sys.exc_info()[0]))
        cls.hard_kill_pool(pid_is, pool)  # sending Ctrl+C
        raise


def hard_kill_pool(pid_is, pool):
    for pid_i in pid_is:
        os.kill(pid_i, signal.SIGINT)  # sending Ctrl+C
    pool.terminate()

Parece funcionar desde la consola y el portátil IPython (con botón de parada), pero no estoy seguro de que sea 100% correcto en todos los casos de esquina.

Respuestas a la pregunta(1)

Su respuesta a la pregunta