Mam następujący kod:Podczas korzystania asyncio, jak można pozwolić wszystkie zadania uruchomione, aby zakończyć przed zamknięciem pętli zdarzeń
@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
uruchomić tę funkcję aż do zakończenia. Problem występuje, gdy jest ustawione wyłączanie - funkcja zostaje zakończona, a wszelkie oczekujące zadania nigdy nie są uruchamiane. (Widać to jako błąd:
task: <Task pending coro=<report() running at script.py:33> wait_for=<Future pending cb=[Task._wakeup()]>>
). Jak poprawnie zaplanować zamknięcie?
Aby podać pewien kontekst, piszę monitor systemu, który odczytuje z/proc/stat co 5 sekund, oblicza użycie procesora w tym okresie, a następnie wysyła wynik do serwera. Chcę kontynuować planowanie tych zadań monitorowania, dopóki nie otrzymam sigterm, gdy zatrzymam planowanie, poczekam na zakończenie wszystkich bieżących zadań i zakończę wdzięcznie.
dać pewien kontekst, Piszę monitor systemu, który odczytuje z pliku/proc/stat co 5 sekund , oblicza użycie procesora w tym okresie, a następnie wysyła wynik do se rver. Chcę kontynuować planowanie tych zadań monitorowania, dopóki nie otrzymam sigterm, gdy zatrzymam planowanie, poczekam na zakończenie wszystkich bieżących zadań i zakończę wdzięcznie. – derekdreery
próbowałeś 'yield z my_expensive_operation() \ n wydaj z' asyncio.sleep (my_interval - timer()% my_interval) 'zamiast? – jfs
Mogłem po prostu spać na tyle długo, że wiem, że wszystko się skończyło, ale to nie wydaje się bardzo czyste. Zastanawiam się, czy istnieje sposób zaplanowania zadań, a następnie uruchom pętlę, dopóki wszystkie zaplanowane zadania nie zostaną zakończone. W javascript (node.js), jeśli główny program osiąga koniec, ale są ustawione wywołania zwrotne, proces jest uruchamiany do momentu usunięcia wszystkich wywołań zwrotnych. – derekdreery