首页 > 解决方案 > Python 多处理约束。仅限于与数据库的 3 个连接

问题描述

我正在使用 Python 3.6.8 并且有一个需要运行 77 次的函数。我正在传递从 PostgreSQL 中提取数据并进行统计分析然后放回数据库的数据。我只能同时运行 3 个进程,因为一次一个进程需要很长时间(每个函数调用大约 10 分钟),而且我一次只能打开 3 个数据库连接。我正在尝试使用多处理的 Poll 库,它试图一次启动所有这些库,这导致了太多的连接错误。我是否正确使用了 poll 方法,如果不是,我应该使用什么来限制只有 3 个函数同时开始和结束。


def AnalysisOf3Years(data):
    FUNCTION RAN HERE
######START OF THE PROGRAM######
print("StartTime ((FINAL 77)): ", datetime.now())
con = psycopg2.connect(host="XXX.XXX.XXX.XXX", port="XXXX", user="USERNAME", password="PASSWORD", dbname="DATABASE")
cur = con.cursor()
date = datetime.today()
cur.execute("SELECT Value FROM table")
Array = cur.fetchall()
Data = []
con.close()
for value in Array:
    Data.append([value,date])
p = Pool(3)
p.map(AnalysisOf3Years,Data)
print("EndTime ((FINAL 77)): ", datetime.now())

标签: pythonpython-3.xmultithreading

解决方案


您可以使用具有数据库连接池作为标准功能的 SQLAlchemy Python 包。

它确实适用于 Postgres 和许多其他数据库后端。

engine = create_engine('postgresql://me@localhost/mydb',
                       pool_size=3, max_overflow=0)

pool_size与数据库的最大连接数。您可以将其设置为 3。

此页面有一些示例如何将其与 Postgres 一起使用 -

https://docs.sqlalchemy.org/en/13/core/pooling.html

根据您的用例,您可能还感兴趣 SingletonThreadPool

https://docs.sqlalchemy.org/en/13/core/pooling.html#sqlalchemy.pool.SingletonThreadPool

每个线程维护一个连接的池。


推荐阅读