Python multitraitement atexit Erreur « Erreur dans atexit._run_exitfuncs »
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.
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:
où 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.