Utilizo la función de señal para eliminar todos los subprocesos en el programa de procesos múltiples, el código se muestra soplado, guárdelo como un archivo llamado mul_process.py:
import time import os import signal from multiprocessing import Process processes = [] def fun(x): print 'current sub-process pid is %s' % os.getpid() while True: print 'args is %s' % x time.sleep(100) def term(sig_num, frame): print 'terminate process %d' % os.getpid() for p in processes: print p.pid try: for p in processes: print 'process %d terminate' % p.pid p.terminate() p.join() except Exception as e: print str(e) if __name__ == '__main__': print 'current main-process pid is %s' % os.getpid() for i in range(3): t = Process(target=fun, args=(str(i),)) t.start() processes.append(t) signal.signal(signal.SIGTERM, term) try: for p in processes: p.join() except Exception as e: print str(e)Usando 'python mul_process.py' para iniciar el programa en Ubuntu 10.04.4 y Python 2.6, cuando comienza a ejecutarse, en otra pestaña, uso kill -15 con el pid del proceso principal para enviar la señal SIGTERM para eliminar todos los procesos, cuando el el proceso principal recibe la señal SIGTERM, sale después de terminar todos los subprocesos, pero cuando uso kill -15 con el pid del subproceso, no funciona, el programa sigue vivo y ejecutándose como antes, y no imprime la oración definida en el término de la función, parece que el subproceso no recibe el SIGTERM. Como sé, el subproceso heredará el controlador de señal, pero no funciona, aquí está la primera pregunta.
Y luego muevo la línea 'signal.signal(signal.SIGTERM, term)' a la posición después de la línea 'if name == ' main ':', así:
if __name__ == '__main__': signal.signal(signal.SIGTERM, term) print 'current main-process pid is %s' % os.getpid() for i in range(3): t = Process(target=fun, args=(str(i),)) t.start() processes.append(t) try: for p in processes: p.join() except Exception as e: print str(e)Inicie el programa y use kill -15 con el pid del proceso principal para enviar la señal SIGTERM, el programa recibe la señal y llama al término de función, pero tampoco elimina ningún subprocesado y sale por sí mismo, esta es la segunda pregunta.
Pocos problemas en su programa: acepte que el subproceso heredará el controlador de señal en su segundo fragmento de código, pero la lista de "procesos" de variables globales no se compartirá. Por lo tanto, la lista de procesos estaría disponible solo con el proceso principal. "proceso" sería una lista vacía para otro subproceso. Puede usar un tipo de mecanismo de cola o tubería para pasar la lista de procesos a los subprocesos. Pero traerá otro problema.
Usted termina el proceso1 y el controlador del proceso1 intenta terminar el proceso2 en el proceso4.
Ahora el proceso 2 también tiene el mismo controlador,
So Process 2 handler again try to terminate all other process
lo que empujará su programa a un bucle infinito.