如何 运行 使用多处理池和 cx_oracle 并行查询
How to run parallel queries using multiporcessing pool and cx_oracle
我正在尝试 运行 使用 python 的 Pool
的多个进程,每个进程都将查询数据库,这就是我尝试将连接传递给每个进程然后启动的原因用于查询执行的新游标
db = DBConnection()
sessoion_pool, cursor= db.get_session_pool()
connection = sessoion_pool.acquire()
part_list = [e for l in get_parts_list() for e in l]
pool = Pool()
pool.map(scan_part_best_model, (part_list, connection))
但它一直在抛出 TypeError: can't pickle cx_Oracle.Connection objects
我也尝试对 Session
做同样的事情并在函数逻辑中使用 session.acquire()
,但它抛出相同的错误
无法在进程之间共享连接。您可以在同一进程中执行并行查询,但是,使用如下代码:
pool = cx_Oracle.SessionPool(USER, PASSWORD, DSN, min=5, max=20, increment=5)
def do_query(part_num):
with pool.acquire() as conn:
cursor = conn.cursor()
cursor.execute("select some_stuff from some_table where part_num = :1",
[part_num])
print("Fetched part information for part", part_num)
threads = [threading.Thread(target=do_query, args=(p,)) for p in get_parts_list()]
for t in threads:
t.start()
for t in threads:
t.join()
从数据库中获取数据后,如果您有重要工作要做,您可以通过多处理将获取的数据传递给子进程以完成该工作。您只是不能在子进程中执行任何数据库工作——至少在没有首先连接到该子进程的情况下不能。
我正在尝试 运行 使用 python 的 Pool
的多个进程,每个进程都将查询数据库,这就是我尝试将连接传递给每个进程然后启动的原因用于查询执行的新游标
db = DBConnection()
sessoion_pool, cursor= db.get_session_pool()
connection = sessoion_pool.acquire()
part_list = [e for l in get_parts_list() for e in l]
pool = Pool()
pool.map(scan_part_best_model, (part_list, connection))
但它一直在抛出 TypeError: can't pickle cx_Oracle.Connection objects
我也尝试对 Session
做同样的事情并在函数逻辑中使用 session.acquire()
,但它抛出相同的错误
无法在进程之间共享连接。您可以在同一进程中执行并行查询,但是,使用如下代码:
pool = cx_Oracle.SessionPool(USER, PASSWORD, DSN, min=5, max=20, increment=5)
def do_query(part_num):
with pool.acquire() as conn:
cursor = conn.cursor()
cursor.execute("select some_stuff from some_table where part_num = :1",
[part_num])
print("Fetched part information for part", part_num)
threads = [threading.Thread(target=do_query, args=(p,)) for p in get_parts_list()]
for t in threads:
t.start()
for t in threads:
t.join()
从数据库中获取数据后,如果您有重要工作要做,您可以通过多处理将获取的数据传递给子进程以完成该工作。您只是不能在子进程中执行任何数据库工作——至少在没有首先连接到该子进程的情况下不能。