fastapi 添加 eureka 报错:RuntimeError: 不能在另一个循环运行时运行事件循环

0 投票
1 回答
21 浏览
提问于 2025-04-12 03:03

我的项目结构如下:

在这里输入图片描述

我想在我的 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

我看到了一些链接,比如这个 https://github.com/keijack/python-eureka-client/issues/76,但是我不太明白它是怎么工作的。我只知道 FastAPI 或 uvicorn 是异步应用,而当我添加 Eureka 这个也是异步应用时,就出现了这个错误,但我不知道该怎么让它正常工作。

1 个回答

0

我通过执行init_async函数,并使用FastAPI中的asynccontextmanager,让它正常工作了:

import py_eureka_client.eureka_client as eureka_client
from fastapi import FastAPI
from contextlib import asynccontextmanager
from landus.controladores import controladorRouter


@asynccontextmanager
async def lifespan(app: FastAPI):
    await eureka_client.init_async(
        eureka_server="http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/",
        app_name="msprueba",
        instance_port=8000,
        instance_host="localhost"
    )
    yield

app = FastAPI(lifespan=lifespan)
app.include_router(controladorRouter)

问题在于,我不能在FastAPI中执行一个也是异步的代码,所以生命周期函数在FastAPI运行之前就执行了。

撰写回答