python - 在进程池中共享数据库连接

标签 python postgresql multiprocessing psycopg2

我有一个 Python 3 程序,它根据行的 ID(在 Postgres 9.5 数据库的表中)更新大量行。

我使用多处理来加速这个过程。由于 Psycopg 的连接不能跨进程共享,我为每一行创建一个连接,然后关闭它。

总体而言,多处理比单处理快(8 个 CPU 快 5 倍)。但是,创建连接的速度很慢:我只想创建几个连接并根据需要保持打开状态。

由于 .map() 将 ids_list 分成许多提交给进程池的 block ,是否可以为同一 block /进程中的所有 ID 共享一个数据库连接?

示例代码:

from multiprocessing import Pool
import psycopg2


def create_db_connection():
    conn = psycopg2.connect(database=database,
                            user=user,
                            password=password,
                            host=host)
    return conn


def my_function(item_id):
    conn = create_db_connection()

    # Other CPU-intensive operations are done here

    cur = conn.cursor()
    cur.execute("""
        UPDATE table
        SET
        my_column = 1
        WHERE id = %s;
        """,
        (item_id, ))
    cur.close()
    conn.commit()


if __name__ == '__main__':
    ids_list = []  # Long list of ids

    pool = Pool()  # os.cpu_count() processes
    pool.map(my_function, ids_list)

感谢您提供的任何帮助。

最佳答案

您可以使用 Pool 构造函数的 initializer 参数。 在初始化函数中设置数据库连接。也许将连接凭据作为参数传递。

查看文档:https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool

关于python - 在进程池中共享数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40064437/

相关文章:

python - Python 中进程群调度的简单示例?

python - 在 python 中使用 object.__class__ 是否有任何注意事项?

java - 我们可以在postgresql中以gzip格式存储数据吗

python - 从给定二维列表中相同坐标的列表中选择最小值

ruby-on-rails - 使用 rails 的 heroku pg 错误,说 "text"不允许使用类型修饰符

sql - 带有两个内连接的 PostgreSQL 查询

Python 多处理 : How to close the multiprocessing pool on exception

Python 2.6 Win32 (xp) 上的 Python 多处理

python - 迭代嵌套字典列表

python - 如何按到给定点的距离对点列表进行排序?