Я хочу создать службу REST с использованием FastAPI и aio-pika, работая асинхронно. Для других драйверов асинхронной базы данных я мог бы создавать клиентов при запуске, когда получаю их в обработчиках маршрутов. Например, для двигателя я бы объявил простой менеджер соединений:
from motor.motor_asyncio import AsyncIOMotorClient
class Database:
client: AsyncIOMotorClient = None
db = Database()
async def connect_to_mongo():
db.client = AsyncIOMotorClient("mongo:27017")
async def close_mongo_connection():
db.client.close()
async def get_mongo_client() -> AsyncIOMotorClient:
return db.client
Затем добавьте пару обработчиков:
app.add_event_handler("startup", connect_to_mongo)
app.add_event_handler("shutdown", close_mongo_connection)
а затем просто используйте get_mongo_client, чтобы передать его моему обработчику.
Проблема в том, что aio-pika нуждается в цикле asyncio для работы. Вот пример из документации:
connection = await aio_pika.connect_robust(
"amqp://guest:guest@127.0.0.1/", loop=loop
)
А с FastAPI у меня нет асинхронного цикла. Есть ли способ использовать его с интерфейсом, как в примере? Могу ли я просто создать новый цикл с помощью asyncio.get_event_loop() и передать его в Connect_robust, не используя его нигде? Вот так:
connection = await aio_pika.connect_robust(
"amqp://guest:guest@127.0.0.1/", loop=asyncio.get_event_loop()
)
Подробнее здесь: https://stackoverflow.com/questions/614 ... th-fastapi