Capture Ctrl + C / SIGINT y salga de multiprocesos con gracia en python


0 Answers

La solución se basa en este enlace y este enlace, y resolvió el problema. Sin embargo, tuve que mudarme a Pool :

import multiprocessing
import time
import signal
import sys

def init_worker():
    signal.signal(signal.SIGINT, signal.SIG_IGN)

def worker():
    while(True):
        time.sleep(1.1234)
        print "Working..."

if __name__ == "__main__":
    pool = multiprocessing.Pool(50, init_worker)
    try:
        for i in range(50):
            pool.apply_async(worker)

        time.sleep(10)
        pool.close()
        pool.join()

    except KeyboardInterrupt:
        print "Caught KeyboardInterrupt, terminating workers"
        pool.terminate()
        pool.join()
Question

¿Cómo atrapo Ctrl + C en el programa multiproceso de python y salgo de todos los procesos correctamente? Necesito que la solución funcione tanto en Unix como en Windows. He intentado lo siguiente:

import multiprocessing
import time
import signal
import sys

jobs = []

def worker():
    signal.signal(signal.SIGINT, signal_handler)
    while(True):
        time.sleep(1.1234)
        print "Working..."

def signal_handler(signal, frame):
    print 'You pressed Ctrl+C!'
    # for p in jobs:
    #     p.terminate()
    sys.exit(0)

if __name__ == "__main__":
    for i in range(50):
        p = multiprocessing.Process(target=worker)
        jobs.append(p)
        p.start()

Y está funcionando, pero no creo que sea la solución correcta.

EDITAR: Esto podría ser un duplicado de este






Related