You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:04