2016-07-15 2 views
1

Я очень озадачен поведением некоторого многопроцессорного кода, который использует 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 

ответ

3

Я думаю, что я понял это. Ответ кроется в том, что многопроцессорность в Python является общим - ничего, поэтому все пространство памяти копируется, функционирует и все. Следовательно, для каждого процесса, даже если pid отличается, пространства памяти являются копиями друг друга, и адрес соединения в пространстве памяти заканчивается тем же. По той же причине, почему объявление глобального пула соединений, как я делал вначале, было бесполезным, каждый процесс имел свой собственный пул соединений с активным только одним подключением.

Смежные вопросы