Асинхронность в 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 шт):
Во первых обращение в БД у тебя не асинхронное. Тебе нужно использовать 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.