2016-10-15 12 views
2

私は、Postgres 9.5データベースのテーブルの中のidに基づいて大きな行のリストを更新するPython 3プログラムを持っています。プロセスプールでDB接続を共有する

私はプロセスを高速化するためにマルチプロセッシングを使用します。 Psycopgの接続をプロセス間で共有できないので、私はの各行に接続を作成して閉じます。

全体的に、マルチプロセッシングは単一処理(8 CPUで5倍高速)より高速です。しかし、接続を作成するのは遅いです:必要なだけ接続を作成し、それらを開いたままにします。

.map()はids_listをプロセスプールに送信する多数のチャンクに分割するので、同じチャンク/プロセス内のすべてのIDに対してデータベース接続を共有できますか?

サンプルコード:あなたが提供することができます任意の助け

from multiprocessing import Pool 
import psycopg2 


def create_db_connection(): 
    conn = psycopg2.connect(database=database, 
          user=user, 
          password=password, 
          host=host) 
    return conn 


def my_function(item_id): 
    conn = create_db_connection() 

    # Other CPU-intensive operations are done here 

    cur = conn.cursor() 
    cur.execute(""" 
     UPDATE table 
     SET 
     my_column = 1 
     WHERE id = %s; 
     """, 
     (item_id,)) 
    cur.close() 
    conn.commit() 


if __name__ == '__main__': 
    ids_list = [] # Long list of ids 

    pool = Pool() # os.cpu_count() processes 
    pool.map(my_function, ids_list) 

感謝。

答えて

関連する問題