async defで同期処理の場合は、ブロッキング処理となってしまう
from fastapi import FastAPI
from asyncio import sleep as async_sleep
from time import sleep
import os
import threading
import time
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/1")
async def async_async_sleep_endpoint():
async_sleep(5)
return os.getpid(),threading.get_ident()
@app.get("/2")
async def async_sleep_endpoint():
return os.getpid(),threading.get_ident()
async defはメインスレッド実行されるので、awaitをつけない場合は、他のリクエストをブロッキングしてしまう。つまりこの例だと、1→2の順にアクセスしたときに、1で5秒待ったあとに2の処理が実行されることになる。awaitをつければ非同期で実行されるので、2の方はすぐに実行される。
defの同期処理は外部スレッドプールで実行される
from fastapi import FastAPI
from asyncio import sleep as async_sleep
from time import sleep
import os
import threading
import time
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/1")
def async_async_sleep_endpoint():
time.sleep(5)
return os.getpid(),threading.get_ident()
@app.get("/2")
def async_sleep_endpoint():
return os.getpid(),threading.get_ident()
こうしたら二つとも外部スレッドプールで実行されるので、出力されるスレッドは異なった。