python - 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
是否意味着池连接数的最大大小?
解决方案
选择第一种方法,因为它非常重量级,重用连接总是更好。例如,看一下来自 aiopg 文档的这个例子,连接正在被重用。一般来说,这是一个很好的做法,与异步编程没有特别的关系。
至于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-异步
另一件事是你想要await query_1(db)
而不是 async query_1(db)
. query_1
应定义为async def
关键字并使用execute
.
推荐阅读
- asp.net-core - ASP.NET CORE - 如何在 Kestrel 服务器中将 allowDoubleEscaping 值设置为 true?
- angular - 在 @angular/fire 中找不到 AngularFireModule 和 AngularFireDatabaseModule
- c - 游戏中的gotoxy与C一起使用
- django - Django过滤器在模型中获取多个用户
- android - HCE:设备锁定且屏幕关闭时在后台执行方法
- java - 无法使用retrofit2解析api
- wordpress - 是否有一个过滤器可以处理 Wordpress 的帖子和输入列表?
- qlikview - 将列中的数据转换为行 - Qlikview Load
- javascript - 获取未定义的道具 - React JS
- javascript - 当 div 内容达到其高度时,开始在不同的列(多列)上显示它们