首页 > 解决方案 > aiopg 使用池连接

问题描述

我对如何正确使用连接轮询有点困惑aiopg

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

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

    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)

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

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

标签: pythonpython-asyncio

解决方案


选择第一种方法,因为它非常重量级,重用连接总是更好。例如,看一下来自 aiopg 文档的这个例子,连接正在被重用。一般来说,这是一个很好的做法,与异步编程没有特别的关系。

至于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-异步

另一件事是你想要await query_1(db)而不是 async query_1(db). query_1应定义为async def关键字并使用execute.


推荐阅读