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

在Python脚本中托管API时能否同时执行其他任务?

在FastAPI中同时运行API和异步任务的解决方案

核心问题解答

在Python脚本中托管FastAPI时,完全可以同时执行其他异步任务,关键是要正确复用FastAPI启动时已创建的事件循环,避免因重复启动循环导致冲突。

错误原因分析

你当前代码使用loop.run_until_complete(sometask())触发了RuntimeError: this event loop is already running,原因是:

  • FastAPI启动后(比如通过uvicorn运行脚本),底层已启动并运行了一个asyncio事件循环
  • 直接调用run_until_complete会尝试再次启动循环,引发循环重复运行的冲突

正确实现方式

使用asyncio.ensure_future(sometask())(Python 3.7+更推荐asyncio.create_task())将异步任务提交到已有的事件循环中执行,同时建议通过FastAPI的启动事件注册任务,确保服务启动时自动运行:

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/")
async def hello():
    return {"Hello": "World"}

async def sometask():
    while True:
        print("executing...")
        await asyncio.sleep(5)

# 注册启动事件,服务启动时自动执行异步任务
@app.on_event("startup")
async def startup_event():
    asyncio.create_task(sometask())

修改后效果:

  • FastAPI启动时会在已有事件循环中异步运行sometask
  • API接口/可正常响应请求,同时sometask每5秒打印一次日志

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:03