2016-07-15 3 views
1

psycopg2を使用しているマルチプロセッシングコードの動作が非常に困惑しており、postgres dbと並行してクエリを実行します。マルチプロセッシングモジュールと別個の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()への呼び出しを経由して別のDB接続になるだろうということです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が異なっていても、メモリ空間は互いにコピーされ、メモリ空間内の接続のアドレスは同じになる。同様の理由は、私が当初のようにグローバル接続プールを宣言することは役に立たず、各プロセスは一度に1つの接続しかアクティブでない独自の接続プールで終わったのです。

関連する問題