2009-05-19 3 views
7

Ich versuche, eine einfache Anwendung für mehrere Prozesse in Python auszuführen. Der Hauptthread erzeugt 1 bis N Prozesse und wartet, bis die Verarbeitung abgeschlossen ist. Die Prozesse jeweils eine Endlosschleife laufen, also können sie möglicherweise für immer ohne einige Benutzer Unterbrechung laufen, so habe ich in einigen Code ein KeyboardInterrupt zu handhaben:Python Multiprocessing atexit Fehler "Fehler in atexit._run_exitfuncs"

#!/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() 

Das Problem ist, dass bei der Verwendung von STRG + C, um zu beenden, I Erhalte einen zusätzlichen Fehler, obwohl die Prozesse augenblicklich zu beenden scheinen:

......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 

Ich verwende Python 2.6 unter Windows. Wenn es eine bessere Möglichkeit gibt, Multiprozessing in Python zu behandeln, lass es mich wissen.

Antwort

1

Anstatt nur sys.exit() zu erzwingen, möchten Sie ein Signal an Ihre Threads senden, um sie anzuhalten. Sehen Sie sich die Verwendung von signal handlers und Threads in Python an.

Sie könnten dies möglicherweise tun, indem Sie Ihre while True: Schleife zu while keep_processing: wo keep_processing ist eine Art globale Variable, die in der KeyboardInterrupt Ausnahme gesetzt wird. Ich denke nicht, dass dies eine gute Übung ist.

+0

Wenn möglich, können Sie ein ausführbares Beispiel für diese Lösung hinzufügen. – cmcginty

Verwandte Themen