Как заставить функционировать Python FastAPI async / await для правильной работы? - PullRequest
0 голосов
/ 20 апреля 2020

Как правильно использовать асинхронные функции в маршруте FastAPI?

Следующий фрагмент кода занимает 10 секунд, чтобы завершить вызов на мой маршрут /home, хотя я ожидаю, что это займет всего 5 секунд.

from fastapi import FastAPI
import time

app = FastAPI()

async def my_func_1():
    """
    my func 1
    """
    print('Func1 started..!!')
    time.sleep(5)
    print('Func1 ended..!!')

    return 'a..!!'

async def my_func_2():
    """
    my func 2
    """
    print('Func2 started..!!')
    time.sleep(5)
    print('Func2 ended..!!')

    return 'b..!!'

@app.get("/home")
async def root():
    """
    my home route
    """
    start = time.time()
    a = await my_func_1()
    b = await my_func_2()
    end = time.time()
    print('It took {} seconds to finish execution.'.format(round(end-start)))

    return {
        'a': a,
        'b': b
    }

Я получаю следующий результат, который выглядит не асинхронным:

λ uvicorn fapi_test:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [5116]
INFO:     Started server process [7780]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:51862 - "GET / HTTP/1.1" 404
Func1 started..!!
Func1 ended..!!
Func2 started..!!
Func2 ended..!!
It took 10 seconds to finish execution.
INFO:     127.0.0.1:51868 - "GET /home HTTP/1.1" 200

Но я ожидаю, что FastAPI будет печататься, как показано ниже:

Func1 started..!!
Func2 started..!!
Func1 ended..!!
Func2 ended..!!
It took 5 seconds to finish execution.

Пожалуйста, поправьте меня, если я делаю что-то не так?

1 Ответ

3 голосов
/ 20 апреля 2020

time.sleep блокирует, вы должны использовать asyncio.sleep, также есть .gather и .wait для агрегирования заданий. Это хорошо задокументировано в Python и FastAPI .

...