Python3.10使用asyncio运行websockets脚本提示无事件循环问题求解
问题解决方法
根因说明
Python 3.10 对asyncio.get_event_loop()的逻辑做了弃用调整:当线程中不存在正在运行的事件循环时,该方法自动创建新循环的行为会触发弃用警告,该特性在后续版本会被移除。而asyncio.get_running_loop()仅能在已经有事件循环处于运行状态的线程中调用,在主线程的同步代码段调用该方法时还没有循环启动,因此抛出运行时错误。
除此之外原代码还存在两处异步语法错误:
websockets.connect是异步上下文管理器,不能在全局同步上下文实例化,必须放到异步函数内部调用receiver.recv()是异步协程方法,必须添加await关键字才能正常获取返回值
修正后代码
import websockets import asyncio async def main(): # 将websocket连接创建移到异步函数内部 async with websockets.connect(<resource_uri>) as receiver: while True: # 异步方法添加await data = await receiver.recv() # do stuff if __name__ == "__main__": # 直接使用asyncio.run管理事件循环,3.7+版本原生支持 asyncio.run(main())
补充说明
asyncio.run()会自动完成「创建事件循环→运行指定协程→关闭事件循环」的全流程,无需手动操作循环对象,是Python 3.7之后官方推荐的异步程序入口写法,完全规避上述弃用警告和运行时错误。
如果有特殊场景必须手动管理事件循环,可以用以下写法替代旧的get_event_loop逻辑:
if __name__ == "__main__": loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(main()) loop.close()
内容的提问来源于stack exchange,提问作者JazzHands
相关产品推荐
相关产品推荐

