Frage

Ich versuche, eine einfache Anwendung mehr Prozesse in Python zu laufen. Der Haupt-Thread laicht 1 bis N Prozessen und wartet, bis sie die gesamte Verarbeitung durchgeführt. Die Prozesse jeweils eine Endlosschleife laufen, also können sie möglicherweise für immer ohne einige Benutzer Unterbrechung laufen, so dass ich in einigen Code ein KeyboardInterrupt zu behandeln:

#!/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, wenn STRG + C mit zu verlassen, erhalte ich einen zusätzlichen Fehler, obwohl die Prozesse sofort zu verlassen 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 bin mit Python 2.6 unter Windows. Wenn es eine bessere Art und Weise ist in Python zu behandeln Multiprozessing, lassen Sie es mich wissen.

War es hilfreich?

Lösung

Rather dann nur zwingen sys.exit(), möchten Sie ein Signal an Threads senden ihnen zu sagen, zu stoppen. Schauen Sie in mit Signal-Handler und Threads in Python.

Sie könnten möglicherweise das tun, indem Sie Ihre while True: Schleife ändert while keep_processing: werden, wo keep_processing eine Art globale Variable ist, die auf der KeyboardInterrupt Ausnahme gesetzt wird. Ich glaube nicht, dies obwohl eine gute Praxis ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top