在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)
在每个函数调用async with db.acquire() as conn:
中的方式2
在aiopg的源代码中,我看到了名为max_size
的设置,这是否意味着池连接的最大数量计数?
答案 0 :(得分:1)
选择第一种方法,因为重载总是最好重用连接。例如。看看aiopg文档中的this example,连接已被重用。通常,这是一个好习惯,与异步编程没有特别的关系。
对于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
的异步版本。