[英]ctrl-C doesn't work after calling second new_event_loop()
我无法用 ctrl-C 终止下面的程序:
import asyncio
loop1 = asyncio.new_event_loop()
asyncio.set_event_loop(loop1)
loop2 = asyncio.new_event_loop()
loop1.run_forever()
但是,我可以终止下面的程序:
import asyncio
# execute this first
loop2 = asyncio.new_event_loop()
loop1 = asyncio.new_event_loop()
asyncio.set_event_loop(loop1)
loop1.run_forever()
为什么?
(我在 python 3.11.1,windows 中运行这些)
这两种方法都不是构建事件循环的正确方法,应该避免这两种方法,启动事件循环的官方方法是将asyncio.run()与协程一起使用。
您看到的行为是因为 asyncio 将当前信号处理程序设置为使用signal.set_wakeup_fd中断最后创建的循环的文件描述符,因此中断信号被发送到循环 2,而循环 1 正在由进程提供服务并且不是在处理操作系统发送的那些信号时,您可以在Handling Keyboard Interruption中阅读更多关于 asyncio 处理键盘中断的方式
为了避免所有这些问题,您应该使用官方方式启动事件循环,即:asyncio文档中的asyncio.run(main())
并避免自己创建循环,否则您会遇到各种麻烦。 (孤立的任务、错误的文件描述符、未处理的信号等)或者只是避免创建多个事件循环,并自己处理创建循环的所有相关后果。
应用程序开发人员通常应使用高级异步函数,例如 asyncio.run(),并且很少需要引用循环 object 或调用其方法。 本节主要面向底层代码、库和框架的作者,他们需要更好地控制事件循环行为。
import asyncio
async def main():
print('Hello ...')
await asyncio.sleep(1)
print('... World!')
asyncio.run(main())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.