如何与多处理Python共享连接池

时间:2019-01-31 01:32:16

标签: postgresql python-2.7 multiprocessing psycopg2

我正在尝试在多个python进程之间共享一个psycopg2.pool。(Simple / Threaded)ConnectionPool。解决这个问题的正确方法是什么?

我正在使用Python 2.7和Postgres9。

我想提供一些背景信息。我之所以要使用连接池,是因为我正在运行一个任意但数量众多(> 80)的进程,这些进程最初使用数据库来查询结果,执行某些操作,然后使用这些操作的结果来更新数据库。

到目前为止,我已经尝试使用multiprocessing.managers.BaseManager并将其传递给子进程,以使正在使用/未使用的连接在各个进程之间同步。

from multiprocessing import Manager, Process
from multiprocessing.managers import BaseManager


PASSWORD = 'xxxx'


def f(connection, connection_pool):
    with connection.cursor() as curs:  # ** LINE REFERENCED BELOW
        curs.execute('SELECT * FROM database')
    connection_pool.putconn(connection) 


BaseManager.register('SimpleConnectionPool', SimpleConnectionPool)
manager = BaseManager()
manager.start()
conn_pool = manager.SimpleConnectionPool(5, 20, dbname='database', user='admin', host='xxxx', password=PASSWORD, port='8080')

with conn_pool.getconn() as conn:
    print conn  # prints '<connection object at 0x7f48243edb48; dsn:'<unintialized>', closed:0>
    proc = Process(target=f, args=(conn, conn_pool))
proc.start()

proc.join()

**引发错误,“操作错误:正在进行异步连接尝试”

如果有人可以推荐一种与众多进程共享连接池的方法,将不胜感激。

1 个答案:

答案 0 :(得分:0)

你不知道。您不能将套接字传递给另一个进程。另一个过程必须打开连接本身。