Как разделить пул соединений с многопроцессорным Python - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь поделиться psycopg2.pool. (Simple / Threaded) ConnectionPool среди нескольких процессов Python.Как правильно подойти к этому?

Я использую Python 2.7 и Postgres 9.

Я хотел бы предоставить некоторый контекст.Я хочу использовать пул соединений, потому что я запускаю произвольное, но большое (> 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 голосов
/ 31 января 2019

Ты не.Вы не можете передать сокет другому процессу.Другой процесс должен открыть само соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...