Ho il seguente codice:Quando si utilizza asyncio, come si fa a consentire tutte le attività in esecuzione per finire prima di arrestare il ciclo degli eventi
@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
ho eseguito questa funzione fino al completo. Il problema si verifica quando viene impostato lo spegnimento: la funzione viene completata e le attività in sospeso non vengono mai eseguite. (Si vede questo come un errore
task: <Task pending coro=<report() running at script.py:33> wait_for=<Future pending cb=[Task._wakeup()]>>
). Come posso programmare un arresto in modo corretto?
Per fornire un contesto, sto scrivendo un monitor di sistema che legge/proc/stat ogni 5 secondi, calcola l'utilizzo della CPU in quel periodo e quindi invia il risultato a un server. Voglio continuare a pianificare questi lavori di monitoraggio fino a quando non ricevo il sigterm, quando smetto di pianificare, attendo che tutti i lavori in corso finiscano, e esco con garbo.
a dare qualche contesto, sto scrivendo un monitor di sistema che legge da/proc/stat ogni 5 secondi , calcola l'utilizzo della CPU in quel periodo, quindi invia il risultato a se stesso rver. Voglio continuare a pianificare questi lavori di monitoraggio fino a quando non ricevo il sigterm, quando smetto di pianificare, attendo che tutti i lavori in corso finiscano, e esco con garbo. – derekdreery
hai provato 'rendimento da my_expensive_operation() \ n rendimento da asyncio.sleep (mio_interval - timer()% mio_interval)' invece? – jfs
Potrei semplicemente dormire abbastanza a lungo da sapere che tutto è finito, ma questo non sembra molto pulito. Mi chiedevo se ci fosse un modo per pianificare le attività e quindi eseguire il ciclo fino a quando tutte le attività pianificate sono state completate. In javascript (node.js), se il programma principale raggiunge la fine ma sono state impostate le callback, il processo viene eseguito fino alla rimozione di tutte le richiamate. – derekdreery