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

FastAPI集成Eureka触发RuntimeError:无法在已有事件循环运行时启动新循环

FastAPI集成Eureka触发事件循环冲突的解决办法

问题场景

为FastAPI应用集成Eureka服务发现,在__init__.py中编写如下代码:

import py_eureka_client.eureka_client as eureka_client
from fastapi import FastAPI


app = FastAPI()

eureka_client.init(eureka_server="http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/",
                   app_name="your_app_name",
                   instance_port=8000)

使用uvicorn启动命令:

uvicorn landus.main:app --reload

触发错误:

RuntimeError: Cannot run the event loop while another loop is running

问题原因

py_eureka_client.init()默认会启动独立的同步线程处理Eureka心跳、注册等逻辑,而uvicorn已经在运行FastAPI的异步事件循环,两者的事件循环机制冲突,导致报错。

解决方案

方案一:使用异步初始化+FastAPI启动事件(推荐)

改用init_async()方法,并借助FastAPI的启动事件完成Eureka注册,让操作复用当前的异步事件循环:

import py_eureka_client.eureka_client as eureka_client
from fastapi import FastAPI


app = FastAPI()

@app.on_event("startup")
async def register_to_eureka():
    await eureka_client.init_async(
        eureka_server="http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/",
        app_name="your_app_name",
        instance_port=8000
    )

这种方式会在应用启动完成前执行Eureka注册,完全适配FastAPI的异步生态,不会产生循环冲突。

方案二:指定现有事件循环给同步初始化

如果坚持使用init()方法,可以手动将uvicorn的异步事件循环传入,避免创建新循环:

import asyncio
import py_eureka_client.eureka_client as eureka_client
from fastapi import FastAPI


app = FastAPI()

# 获取当前运行的异步事件循环
current_loop = asyncio.get_event_loop()
eureka_client.init(
    eureka_server="http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/",
    app_name="your_app_name",
    instance_port=8000,
    loop=current_loop
)

注意:这种方式需要确保在uvicorn的事件循环启动后再执行初始化,否则可能获取不到正确的循环,因此不如方案一稳定。

内容的提问来源于stack exchange,提问作者Alan Gaytan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:07:25