ich den folgenden Code haben:Wenn asyncio verwenden, wie können Sie alle laufenden Aufgaben vor beenden die Ereignisschleife Abschalten
@asyncio.coroutine
def do_something_periodically():
while True:
asyncio.async(my_expensive_operation())
yield from asyncio.sleep(my_interval)
if shutdown_flag_is_set:
print("Shutting down")
break
ich diese Funktion bis zur vollständigen laufen. Das Problem tritt auf, wenn Herunterfahren festgelegt ist - die Funktion wird beendet und alle ausstehenden Aufgaben werden nie ausgeführt. (Sie sehen dies als Fehler
task: <Task pending coro=<report() running at script.py:33> wait_for=<Future pending cb=[Task._wakeup()]>>
). Wie plane ich ein Herunterfahren korrekt?
Um einen Kontext zu geben, schreibe ich einen Systemmonitor, der alle 5 Sekunden aus/proc/stat liest, die CPU-Nutzung in diesem Zeitraum berechnet und dann das Ergebnis an einen Server sendet. Ich möchte diese Überwachungsjobs so lange planen, bis ich signerm erhalte, wenn ich mit der Planung aufhöre, auf den Abschluss aller aktuellen Jobs warte und elegant aus dem System auschecke.
etwas Kontext zu geben, ich bin ein System-Monitor zu schreiben, die von/proc/stat liest alle 5 Sekunden , berechnet die CPU-Nutzung in diesem Zeitraum und sendet das Ergebnis dann an ein se rver. Ich möchte diese Überwachungsjobs so lange planen, bis ich signerm erhalte, wenn ich mit der Planung aufhöre, auf den Abschluss aller aktuellen Jobs warte und elegant aus dem System auschecke. – derekdreery
haben Sie versucht, yield von my_expensive_operation() \ n yield von asyncio.sleep (my_interval - timer()% my_interval) 'stattdessen? – jfs
Ich könnte nur lange genug schlafen, dass ich weiß, dass alles fertig ist, aber das scheint nicht sehr sauber zu sein. Ich habe mich gefragt, ob es eine Möglichkeit gibt, Aufgaben zu planen und dann die Schleife auszuführen, bis alle geplanten Aufgaben abgeschlossen sind. Wenn in javascript (node.js) das Hauptprogramm das Ende erreicht, aber Callbacks gesetzt sind, wird der Prozess ausgeführt, bis alle Callbacks entfernt sind. – derekdreery