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)
感謝。