85 votes

Catch Ctrl+C et de sortie multiprocesses gracieusement en python

Comment puis-je attraper un Ctrl+C dans multi process programme en python et la sortie de tous les processus gracieusement, j'ai besoin de la solution de travailler à la fois sur windows et unix. J'ai essayé ce qui suit:

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

Et c'est le genre de travail, mais je ne pense pas que c'est la bonne solution.

EDIT: Cela peut être un doublon de ce un

36voto

zenpoy Points 6175

La solution est basée sur ce lien et ce lien et il a résolu le problème, j'ai dû déménagé Pool bien que:

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

14voto

derkan Points 41

Juste la poignée KeyboardInterrupt-SystemExit des exceptions dans votre processus de travail:

def worker():
    while(True):
        try:
            msg = self.msg_queue.get()
        except (KeyboardInterrupt, SystemExit):
            print "Exiting..."
            break

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X