GOOGLE ADS

dimanche 17 avril 2022

Le moyen le plus approprié d'arrêter la boucle d'événements après l'appel de asyncio.run ?

Considérant le code suivant:

import asyncio
async def main() -> None:
await asyncio.sleep(2**256)
if __name__ == '__main__':
asyncio.run(main())

Quelle est la manière la plus appropriée de terminer la coroutine principale, après qu'elle a été appelée par asyncio.run ? Lorsque j'ai invoqué le script et appuyé sur CTRL + C, j'ai vu un retraçage laid.

Comme je peux le voir dans le code source, asyncio.run fait beaucoup de machinerie dans les coulisses, donc j'aimerais continuer à l'utiliser.


Solution du problème

Vous devriez probablement gérer le signal SIGINT.

import asyncio
import functools
import signal
async def main() -> None:
await asyncio.sleep(2**256)
def handler(loop):
...
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, functools.partial(handler, loop=loop))
loop.run_until_complete(main())

La question est de savoir à quoi devrait ressembler le gestionnaire ? Si vous voulez simplement fermer le programme sans exception, utilisezsys.exit()

def handler(loop):
sys.exit()

Cependant, pour tout fermer gracieusement, vous devez terminer chaque tâche et arrêter la boucle. Voir ce sujet pour plus d'informations.

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...