0
0

fast apiのasync defとdef

Last updated at Posted at 2024-09-14

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()

こうしたら二つとも外部スレッドプールで実行されるので、出力されるスレッドは異なった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0