首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块级的上下文管理资源

模块级的上下文管理资源
EN

Stack Overflow用户
提问于 2020-08-27 16:27:56
回答 1查看 88关注 0票数 2

我正在寻找一种模式,在这种模式中,我有多个函数需要访问上下文管理的资源。

特别是,我正在使用fastAPI,并且希望重用aiopg (异步psycopg2)连接。

这是基本布局:

代码语言:javascript
复制
@app.get("/hello")
def hello():
    async with aiopg.connect(...) as conn:
        async with conn.cursor(...):
            return cursor.execute(...)

现在,我希望避免每个路由都有一个连接。我可以在外部考虑一个对象,在此过程中,我要么访问conn属性,要么等待创建(并存储回来),然后在cursor()方法上使用with

代码语言:javascript
复制
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(...)

但是,我将失去自动关闭连接的能力。

我认为我在这里遗漏了一些非常明显的东西,希望有人能指导我如何正确地实现它。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-27 17:30:42

aiopg提供了一个可以管理连接的Pool class

只需在模块级别创建一个池实例:

代码语言:javascript
复制
pool = await aiopg.create_pool('<your connection string>')

然后,您可以使用Pool.acquire上下文管理器来获取连接:

代码语言:javascript
复制
async with pool.acquire() as conn:
    ...

如果池中已存在连接,则将重用这些连接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63612066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档