Aiopg使用池连接

时间:2019-05-22 15:16:34

标签: python python-asyncio

aiopg中,我对如何使用连接轮询感到困惑。

在请求之前,我应该每次都打电话给async with db.acquire() as conn:吗?还是可以只给一个电话acquire

例如,我有一些观点可以在数据库中进行一些查询(没有事务)。假设有两种方式:

    1。
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)
    2。
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)

在每个函数调用async with db.acquire() as conn:中的方式2

在aiopg的源代码中,我看到了名为max_size的设置,这是否意味着池连接的最大数量计数?

1 个答案:

答案 0 :(得分:1)

选择第一种方法,因为重载总是最好重用连接。例如。看看aiopg文档中的this example,连接已被重用。通常,这是一个好习惯,与异步编程没有特别的关系。

对于async with db.acquire(),它是异步上下文管理器,这意味着协程可以放弃控制进入和退出其下一个块的控制。参见https://docs.python.org/3/reference/datamodel.html#context-managershttps://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的异步版本。