Question

Je suis en train d'exécuter une simple application de plusieurs processus en Python. Le fil conducteur engendre 1 à N processus et attend jusqu'à ce que tous fait le traitement. Les processus chaque passage une boucle infinie, afin qu'ils puissent potentiellement courir pour toujours sans interruption certaine de l'utilisateur, donc je mis dans un code pour gérer un KeyboardInterrupt:

#!/usr/bin/env python
import sys
import time
from multiprocessing import Process

def main():
    # Set up inputs..

    # Spawn processes
    Proc( 1).start()
    Proc( 2).start()

class Proc ( Process ):
    def __init__ ( self, procNum):
        self.id = procNum
        Process.__init__(self)

    def run ( self ):
        doneWork = False

        while True:

            try:
                # Do work...
                time.sleep(1)
                sys.stdout.write('.')

                if doneWork:
                    print "PROC#" + str(self.id) + " Done."
                    break

            except KeyboardInterrupt:
                print "User aborted."
                sys.exit()

# Main Entry
if __name__=="__main__":
    main()

Le problème est que lorsque vous utilisez CTRL-C pour quitter, je reçois une erreur supplémentaire même si les processus semblent quitter immédiatement:

......User aborted.
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function
    p.join()
  File "C:\Python26\lib\multiprocessing\process.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt
Error in sys.exitfunc:
Traceback (most recent call last):
  File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function
    p.join()
  File "C:\Python26\lib\multiprocessing\process.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt

Je suis en cours d'exécution Python 2.6 sous Windows. S'il y a une meilleure façon de gérer multitraitement en Python, s'il vous plaît laissez-moi savoir.

Était-ce utile?

La solution

plutôt que de simplement forcer sys.exit(), vous voulez envoyer un signal à vos fils pour leur dire d'arrêter. Regarder dans gestionnaires de signaux et des fils dans le python.

Vous pouvez éventuellement faire en changeant votre boucle de while True: à while keep_processing:keep_processing est une sorte de variable globale qui se prépare à l'exception KeyboardInterrupt. Je ne pense pas que ce soit une bonne pratique cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top