Heim  >  Artikel  >  Backend-Entwicklung  >  Wie gehe ich mit Python mit Tastaturunterbrechungen in Multiprocessing-Pools um?

Wie gehe ich mit Python mit Tastaturunterbrechungen in Multiprocessing-Pools um?

DDD
DDDOriginal
2024-10-22 16:35:02893Durchsuche

How to Handle Keyboard Interruptions in Multiprocessing Pools with Python?

Behandlung von Tastaturunterbrechungen in Multiprocessing-Pools mit Python

Die Behandlung von Tastaturunterbrechungen ist entscheidend für die effektive Verwaltung paralleler Prozesse. Die Multiprocessing-Bibliothek bietet eine Möglichkeit, einen Pool von Arbeitsprozessen zu erstellen, die Aufgaben gleichzeitig ausführen können. Es tritt jedoch ein Problem auf, wenn während der Ausführung dieser Prozesse ein KeyboardInterrupt initiiert wird.

Problem:

Im angegebenen Python-Code wird ein Pool erstellt und ein Versuch durchgeführt ist dafür gemacht, KeyboardInterrupts mithilfe eines Try-Except-Blocks zu verarbeiten. Der entsprechende Code im Ausnahmeblock wird jedoch nie ausgeführt, sodass das Programm hängen bleibt.

<code class="python">try:
    results = pool.map(slowly_square, range(40))
except KeyboardInterrupt:
    pool.terminate()
    print("You cancelled the program!")
    sys.exit(1)</code>

Ursache:

Dieses Problem wird durch einen Fehler in Python verursacht KeyboardInterrupts werden nicht gesendet, wenn in threading.Condition.wait() auf eine Bedingung gewartet wird. In der Multiprocessing-Bibliothek verwendet der Pool eine Bedingungsvariable, um auf die Ergebnisse der Map()-Operation zu warten. Wenn ein KeyboardInterrupt auftritt, kehrt die Bedingungsvariable wait() nicht zurück und verhindert so, dass der Interrupt verarbeitet wird.

Lösung:

Um dieses Problem zu beheben, gibt es einen Workaround besteht darin, beim Warten auf die Ergebnisse eine Zeitüberschreitung anzugeben. Dies kann erreicht werden, indem der Aufruf von „map()“ durch „map_async().get(timeout)“ ersetzt wird, wobei „Timeout“ auf einen großen Wert gesetzt wird.

<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>

Durch die Angabe eines Timeouts kann die Bedingungsvariable „wait()“ wird auch dann zurückgegeben, wenn der KeyboardInterrupt nicht verarbeitet wurde. Dadurch kann der Ausnahmeblock ausgeführt werden, was die Beendigung des Pools und die ordnungsgemäße Behandlung des Interrupts ermöglicht.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Python mit Tastaturunterbrechungen in Multiprocessing-Pools um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn