Насколько я понимаю, когда вызывается синхронный маршрут (определенный с помощью def), FastAPI выгружает его в отдельный поток из пула потоков, чтобы избежать блокировки основного цикла событий. Это имеет смысл, поскольку поток может быть заблокирован (например, time.sleep()), но сам цикл обработки событий не блокируется, поскольку он продолжает обрабатывать другие запросы.
Но вот что мое замешательство: если функция действительно блокирует (например, ожидает чего-то вроде time.sleep()), как цикл событий все еще может одновременно выполнять другие задачи? Разве интерпретатор Python не должен выполнять только один поток за раз?
Вот пример:
Код: Выделить всё
from fastapi import APIRouter
import os
import threading
import asyncio
app = APIRouter()
@app.get('/sync')
def tarefa_sincrona():
print('Sync')
total = 0
for i in range(10223424*1043):
total += i
print('Sync task done')
@app.get('/async')
async def tarefa_sincrona():
print('Async task')
await asyncio.sleep(5)
print('Async task done')
Подробнее здесь: https://stackoverflow.com/questions/793 ... event-loop
Мобильная версия