Я очень озадачен поведением некоторого многопроцессорного кода, который использует psycopg2, чтобы делать запросы параллельно с db postgres.многопроцессорный модуль и отдельные соединения psycopg2
По существу, я делаю тот же запрос (с разными параметрами) для различных разделов большой таблицы. Я использую multiprocessing.Pool для разветвления отдельного запроса.
Мой многопроцессорная вызов выглядит следующим образом:
pool = Pool(processes=num_procs)
results=pool.map(run_sql, params_list)
Мой run_sql код выглядит следующим образом:
def run_sql(zip2):
conn = get_connection()
curs = conn.cursor()
print "conn: %s curs:%s pid=%s" % (id(conn), id(curs), os.getpid())
...
curs.execute(qry)
records = curs.fetchall()
def get_connection()
...
conn = psycopg2.connect(user=db_user, host=db_host,
dbname=db_name, password=db_pwd)
return conn
Так я ожидаю, что каждый процесс будет получить отдельное соединение с БД через призыв к get_connection()
и что print id(conn)
отобразит отличное значение. Однако, похоже, это не так, и я затрудняюсь это объяснить. Даже print id(curs)
- это то же самое. Только print os.getpid()
показывает разницу. Использует ли он каким-то образом одно и то же соединение для каждого разветвленного процесса?
conn: 4614554592 curs:4605160432 pid=46802
conn: 4614554592 curs:4605160432 pid=46808
conn: 4614554592 curs:4605160432 pid=46810
conn: 4614554592 curs:4605160432 pid=46784
conn: 4614554592 curs:4605160432 pid=46811