Aiopg использовать подключение к пулу - PullRequest
0 голосов
/ 22 мая 2019

Я немного озадачен тем, как использовать опрос соединения в aiopg справа.

Должен ли я звонить async with db.acquire() as conn: каждый раз перед запросом или может быть только один звонок acquire?

Например, у меня есть точка зрения, которая делает несколько запросов в базе данных (без транзакций). Допустим, есть два пути:

async def request_handle(request):
    db = request.config_dict['db']  # db is Engine
    async with db.acquire() as conn:
        await query_1(conn)
        await query_2(conn)
        await query_3(conn)
async def request_handle(request):
    db = request.config_dict['db']  # db is Engine
    await query_1(db)
    await query_2(db)
    await query_3(db)

В пути 2 в каждом вызове функции async with db.acquire() as conn:

В источнике aiopg я видел настройки, которые называли max_size означает ли это максимальный размер количества подключений к пулу?

1 Ответ

1 голос
/ 23 мая 2019

Пойдите для первого подхода, так как всегда лучше повторно использовать соединение, так как оно довольно тяжелое.Например, посмотрите на этот пример из aiopg docs, соединение используется повторно.В целом, это хорошая практика, не относящаяся конкретно к асинхронному программированию.

Что касается async with db.acquire(), то это асинхронный менеджер контекста, то есть сопрограмма может отказаться от входа в контроллер и выхода из блока под ним.См. https://docs.python.org/3/reference/datamodel.html#context-managers и https://www.python.org/dev/peps/pep-0492/#asynchronous-context-managers-and-async-with

Другое дело, что вы хотите await query_1(db) вместо async query_1(db).query_1 следует определять как ключевое слово async def и использовать асинхронные версии execute.

...