Heim >Backend-Entwicklung >Python-Tutorial >Wie gehe ich mit Tastaturunterbrechungen im Multiprocessing-Pool von Python um?
Im Multiprocessing-Modul von Python bietet die Pool-Klasse eine praktische Möglichkeit, Aufgaben auf mehrere Prozesse zu verteilen. Der Umgang mit KeyboardInterrupt-Ereignissen in Pools kann jedoch eine Herausforderung sein, wie das Code-Snippet zeigt:
<code class="python">from multiprocessing import Pool from time import sleep from sys import exit def slowly_square(i): sleep(1) return i*i def go(): pool = Pool(8) try: results = pool.map(slowly_square, range(40)) except KeyboardInterrupt: # **** THIS PART NEVER EXECUTES. **** pool.terminate() print "You cancelled the program!" sys.exit(1) print "\nFinally, here are the results: ", results if __name__ == "__main__": go()</code>
Beim Ausführen dieses Codes löst das Drücken von Strg C den Bereinigungsprozess nicht aus, sodass die Unterprozesse auf unbestimmte Zeit ausgeführt werden. Um dieses Problem zu beheben, ziehen Sie die folgende Problemumgehung in Betracht:
Das im Code beobachtete Verhalten ist eine Folge eines Python-Fehlers. KeyboardInterrupt wird nicht gesendet, wenn in threading.Condition.wait() auf eine Bedingung gewartet wird. Da Pool.map() intern eine Wartebedingung verwendet, wird der Interrupt nie empfangen.
Eine Lösung ist die Verwendung von Pool.map_async(), die die Angabe eines Timeouts ermöglicht. Durch die Festlegung eines ausreichend langen Timeouts (z. B. 9999999) können wir sicherstellen, dass der Interrupt innerhalb einer angemessenen Zeit ausgelöst wird.
Ersetzen Sie daher:
<code class="python"> results = pool.map(slowly_square, range(40))</code>
durch:
<code class="python"> results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
Diese Problemumgehung bietet eine Möglichkeit, KeyboardInterrupt-Ereignisse in Multiprozessor-Pools ordnungsgemäß zu verarbeiten und ermöglicht die Beendigung aller Unterprozesse, wenn der Benutzer das Programm abbricht.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit Tastaturunterbrechungen im Multiprocessing-Pool von Python um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!