FastAPI 等待任务行为

FastAPI awaits on task behaviour

为什么FastAPI不抱怨下面的任务

app.state["my_task"] = asyncio.create_task(my_task())

没有在代码的任何部分等待?

appFastAPI() 的一个实例,而 app.state 是一个简单的字典。

我什至可以在关机回调中 app.state["my_task"].cancel()

来自asyncio docs:

When a coroutine function is called, but not awaited (e.g. coro() instead of await coro()) or the coroutine is not scheduled with asyncio.create_task(), asyncio will emit a RuntimeWarning

因此,预计在使用create_task() 时不会发出警告。这不是 FastAPI 的独有行为。您可以在下面的最小代码段中查看它:

import asyncio


async def task():
    print("foobar")


async def main():
    # task()        # Emits a RuntimeWarning
    # await task()  # Does not emmit
    x = asyncio.create_task(task())  # Doesn't either


loop = asyncio.get_event_loop()
loop.run_until_complete(main())

编辑PS:按原样调用协程函数不会安排底层任务(和returns一个协程对象),而调用create_task()会(并且returns 一个任务对象)。有关详细信息,请再次查看 asyncio docs.