FastAPI 等待任务行为
FastAPI awaits on task behaviour
为什么FastAPI
不抱怨下面的任务
app.state["my_task"] = asyncio.create_task(my_task())
没有在代码的任何部分等待?
app
是 FastAPI()
的一个实例,而 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.
为什么FastAPI
不抱怨下面的任务
app.state["my_task"] = asyncio.create_task(my_task())
没有在代码的任何部分等待?
app
是 FastAPI()
的一个实例,而 app.state
是一个简单的字典。
我什至可以在关机回调中 app.state["my_task"].cancel()
。
来自asyncio
docs:
When a coroutine function is called, but not awaited (e.g.
coro()
instead ofawait coro()
) or the coroutine is not scheduled withasyncio.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.