Heim  >  Artikel  >  Backend-Entwicklung  >  So behandeln Sie KeyboardInterrupt mit Multiprocessing-Pools in Python ordnungsgemäß

So behandeln Sie KeyboardInterrupt mit Multiprocessing-Pools in Python ordnungsgemäß

Linda Hamilton
Linda HamiltonOriginal
2024-10-22 14:23:03603Durchsuche

How to Gracefully Handle KeyboardInterrupt with Multiprocessing Pools in Python

Behandlung von Tastaturunterbrechungen in Multiprocessing-Pools: Eine Python-Falle

Im Multiprocessing-Modul von Python scheitern KeyboardInterrupt-Ereignisse scheinbar daran, Arbeitsprozesse innerhalb eines Pools zu beenden. Betrachten Sie den Codeausschnitt:

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

Wenn Sie Strg C drücken, um einen KeyboardInterrupt auszulösen, bleibt der Code auf unbestimmte Zeit hängen, anstatt den Pool ordnungsgemäß zu beenden. Dies liegt an einem Python-Fehler, der verhindert, dass KeyboardInterrupt Aufrufe von threading.Condition.wait() unterbricht.

Workaround:

Eine Workaround-Lösung besteht darin, eine Zeitüberschreitung anzugeben für den Poolbetrieb. Ersetzen Sie:

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

Durch die Angabe eines beliebig großen Timeouts beseitigen Sie effektiv das Blockierungsverhalten und ermöglichen eine sofortige Verarbeitung des Interrupts. Dadurch werden alle Arbeitsprozesse ordnungsgemäß beendet, wenn Strg C gedrückt wird.

Das obige ist der detaillierte Inhalt vonSo behandeln Sie KeyboardInterrupt mit Multiprocessing-Pools in Python ordnungsgemäß. 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