Bei der Arbeit mit dem Multiprocessing-Pool von Python ist der Umgang mit KeyboardInterrupt-Ereignissen nicht immer einfach. In diesem Artikel werden wir untersuchen, wie mit solchen Interrupts umgegangen wird und sichergestellt wird, dass die Prozesse ordnungsgemäß beendet werden.
Das bereitgestellte Codebeispiel veranschaulicht die Herausforderung. Obwohl es einen Catch-Block für KeyboardInterrupt gibt, wird er nicht ausgeführt, wenn Strg-C gedrückt wird. Stattdessen bleibt das Programm hängen, bis es extern beendet wird.
Die Ursache dieses Problems liegt in einem Python-Fehler im Zusammenhang mit der Blockierung einer Bedingung in threading.Condition.wait(). In diesem Zusammenhang wird KeyboardInterrupt nie gesendet. Dadurch wird verhindert, dass der Interrupt innerhalb des Pools verarbeitet wird.
Eine Lösung für dieses Problem besteht darin, beim Warten auf die Ergebnisse ein Timeout anzugeben. Anstelle von map() kann die Methode map_async() mit einem Timeout-Parameter verwendet werden. Durch diesen Ansatz kann der KeyboardInterrupt erkannt und verarbeitet werden:
<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
Indem wir einen großen Timeout-Wert festlegen, weisen wir den Pool im Wesentlichen an, weiterhin auf die Ergebnisse zu warten, bis er vom Benutzer unterbrochen wird.
Es ist wichtig zu beachten, dass es bei dieser Problemumgehung einige Einschränkungen gibt. Wenn die Zeitüberschreitung abläuft, bevor alle Aufgaben abgeschlossen sind, werden die unvollständigen Ergebnisse verworfen. Daher ist es wichtig, einen geeigneten Timeout-Wert zu wählen, der die Reaktionsfähigkeit mit dem Risiko unvollständiger Ergebnisse in Einklang bringt.
Das obige ist der detaillierte Inhalt vonWie kann man Tastaturunterbrechungen in Python-Multiprocessing-Pools ordnungsgemäß behandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!