Heim  >  Artikel  >  Backend-Entwicklung  >  Wie gehe ich mit Tastaturunterbrechungen im Multiprocessing-Pool von Python um?

Wie gehe ich mit Tastaturunterbrechungen im Multiprocessing-Pool von Python um?

Susan Sarandon
Susan SarandonOriginal
2024-10-22 14:22:03252Durchsuche

How to Handle Keyboard Interrupts in Python's Multiprocessing Pool?

Umgang mit Tastaturunterbrechungen im Multiprocessing-Pool von Python

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!

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