如何解决模块级别的上下文管理资源
我正在寻找一种模式,其中有多个功能需要访问上下文管理的资源。
尤其是,我正在使用fastAPI
,并希望重新使用aiopg
(异步psycopg2
)连接。
这是基本布局:
@app.get("/hello")
def hello():
async with aiopg.connect(...) as conn:
async with conn.cursor(...):
return cursor.execute(...)
现在,我想避免每个路由的连接。我可以想到一个外部对象,在路由中,我可以访问conn
属性或等待创建(并存储回去),然后仅在with
方法上使用cursor()
。 / p>
class Pg():
async def conn(self):
if not self._conn:
self._conn = await aiopg.connect(...)
return self._conn
myPg = Pg()
@app.get("/hello")
def hello():
conn = await myPg.conn()
async with conn.cursor(...):
return cursor.execute(...)
但是,我将失去自动关闭连接的能力。
我想我想念这里确实很明显的东西,希望有人可以指导我如何正确地实现这一点。
谢谢!
解决方法
aiopg提供了一个Pool
class,可以管理连接。
只需在模块级别创建一个池实例:
pool = await aiopg.create_pool('<your connection string>')
然后,您可以使用Pool.acquire
上下文管理器来建立连接:
async with pool.acquire() as conn:
...
如果池中已经存在连接,则将重新使用它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。