Асинхронность в python

Имеется REST API, реализованный на FASTApi:

@app.get('/api/all_transfers', response_model=List[TransferOut])
async def all_transfers(db: Session = Depends(get_db)):
    transfer_data = await get_all_transfers(db)
    return transfer_data

Функция get_all_transfers(db)

from sqlalchemy.orm import Session
from repository.DatabaseConnection import SessionLocal
from repository.models import Transfers

import asyncio

async def get_all_transfers(db: Session):
    all_transfers = db.query(Transfers).all()
    if all_transfers:
        return all_transfers
    else:
        return {"error": "error text"}

отправляю запросы в БД для получения данных из test.py:

import requests
from threading import Thread
import json
import time


def send_request():
    url = "http://127.0.0.1:8000/api/all_transfers"
    for i in range(50):
        response = requests.get(url)
        print(response.text)
        print('good')
    else:
        print('bad')

thread1 = Thread(target=send_request)

start = time.time()
thread1.start()
thread1.join()
end = time.time() - start
print('Time :', end)

В какой-то момент отправка запросов останавливается. Мои подозрения: неправильно реализованная асинхронность. Почему моя асинхронность не работает?

UPD: Подключение к БД

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session

engine = create_engine("postgresql+psycopg2://postgres:934007717@localhost:5432/megafon")

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Ответы (1 шт):

Автор решения: Isaac Azimov

Во первых обращение в БД у тебя не асинхронное. Тебе нужно использовать AsyncSession, чтобы с помощью sqlalchemy делать не блокирующие запросы.

Простое добавление async перед def не делает функцию сразу асинхронной.

Твоя функция должна быть примерно такой:

async def get_all_transfers(db: AsyncSession):
    async with db.begin():
         all_transfers = (await db.execute(select(Transfers))).scalars()
    return all_transfers

А вызов этой функции:

@app.get('/api/all_transfers', response_model=List[TransferOut])
async def all_transfers():
    async with async_session() as session:
        transfer_data = await get_all_transfers(db)
    return transfer_data

В целом почитай документацию про то как использовать sqlachemy в asyncio и чтобы лучше понять как работает асинхронный код можно почитать статью про генераторы и asyncio.

→ Ссылка