首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >许多线程中的Postgres连接

许多线程中的Postgres连接
EN

Stack Overflow用户
提问于 2021-08-05 08:45:50
回答 1查看 1.2K关注 0票数 0

在特殊情况下我需要一些建议。

我有一个这样的程序:

代码语言:javascript
运行
复制
data = [...]
multithread.Pool(n, data)

def slow_function(data)
    db = psycopg2.connect(credentials)
    cursor = db.cursor()
    new_data = realy_slow_func()
    some_query = "some update query"
    cursor.execute(some_query )

在每个线程中打开新连接安全吗?如果它是缓慢的,并且存在更快的方法,这并不重要。

  • 线程是必需的,因为realy_slow_func()很慢。
  • 数据库的凭据对于每个线程都是相同的。
  • 我正在使用psycopg2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-05 08:53:22

您应该使用连接池,它将创建一个连接池,并在线程中重用相同的连接。我也建议使用ThreadPool,以便每次运行的线程数等于DB连接池中可用的连接数。但就这个问题的范围而言,我将讨论DB连接池

我还没有测试代码,但这就是它的外观。首先创建一个connectionPool,然后在线程中从它获得一个连接,并在完成后释放连接。您还可以在线程之外管理get连接和发布,只需将连接作为参数传递,并在线程完成后发布。

ThreadedConnectionPool突出显示为用于创建池的类,顾名思义,它适用于线程。

从医生那里:

与线程模块一起工作的连接池。注意,这个池类可以安全地在多线程应用程序中使用。

代码语言:javascript
运行
复制
import psycopg2
from psycopg2 import pool

postgreSQL_pool = psycopg2.pool.ThreadedConnectionPool(1, 20, user="postgres",
                                                         password="pass@#29",
                                                         host="127.0.0.1",
                                                         port="5432",
                                                         database="postgres_db")

data = [...]
multithread.Pool(n, data)

def slow_function(data):
    db = postgreSQL_pool.getconn()
    cursor = db.cursor()
    new_data = realy_slow_func()
    some_query = "some update query"
    cursor.execute(some_query)
    cursor.close()
    postgreSQL_pool.putconn(db)

来源:https://pynative.com/psycopg2-python-postgresql-connection-pooling/

博士:https://www.psycopg.org/docs/pool.html

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

https://stackoverflow.com/questions/68663333

复制
相关文章

相似问题

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