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