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