update instalar español descargar python linux

python - instalar - ¿Cuál es la mejor manera de ejecutar múltiples subprocesos a través de fork()?



uninstall python linux (4)

¿Has mirado el módulo de pyprocessing ?

Una secuencia de comandos python necesita generar múltiples subprocesos a través de fork (). Todos esos procesos secundarios deben ejecutarse simultáneamente y el proceso principal debe estar esperando a que todos ellos finalicen. Tener la capacidad de establecer un tiempo de espera en un niño "lento" sería agradable. El proceso principal continúa procesando el resto del script una vez que se recogen todos los niños.

¿Cuál es la mejor manera de resolverlo? Gracias.


Ejemplo simple:

import os chidren = [] for job in jobs: child = os.fork() if child: children.append(child) else: pass # really should exec the job for child in children: os.waitpid(child, 0)

Darle un plazo a un niño lento es un poco más de trabajo; puede usar wait lugar de waitpid y seleccionar los valores devueltos de la lista de elementos waitpid , en lugar de esperar cada uno por turno (como aquí). Si configura una alarm con un controlador SIGALRM , puede finalizar la espera después de un retraso especificado. Esta es toda la información estándar de UNIX, no específica de Python ...


La forma tradicional de UNIX-y para comunicarse con los subprocesos es abrir las tuberías a su entrada / salida estándar, y usar la llamada al sistema select() para multiplexar las comunicaciones en el proceso principal (disponible en Python a través de ... módulo).

Si necesita eliminar un proceso hijo que se ejecuta lentamente, puede guardar su ID de proceso (devuelto por la llamada a os.fork() ) y luego usar os.kill() para eliminarlo cuando ya no sea necesario. Por supuesto, probablemente sería más limpio poder comunicarse explícitamente con el proceso secundario y decirle que se apague.


Ephemient : cada niño en tu código permanecerá en el ciclo for luego de que termine su trabajo. Él tecerá una y otra vez. Además, los niños que comienzan cuando los niños [] no están vacíos intentarán esperar a algunos de sus hermanos al final del ciclo. Eventualmente alguien chocará. Esta es una solución alternativa:

import os, time def doTheJob(job): for i in xrange(10): print job, i time.sleep(0.01*ord(os.urandom(1))) # random.random() would be the same for each process jobs = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] imTheFather = True children = [] for job in jobs: child = os.fork() if child: children.append(child) else: imTheFather = False doTheJob(job) break # in the meanwhile # ps aux|grep python|grep -v grep|wc -l == 11 == 10 children + the father if imTheFather: for child in children: os.waitpid(child, 0)