我正在尝试使用 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(),但它会抛出同样的错误
1 回答
白衣非少年
TA贡献1155条经验 获得超0个赞
进程之间不能共享连接。但是,您可以使用如下代码在同一进程中执行并行查询:
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()
从数据库中获取数据后,如果您有大量工作要做,您可以通过多处理将获取的数据传递给子进程来完成这项工作。您不能在子进程中执行任何数据库工作——至少在没有首先连接该子进程的情况下是这样。
添加回答
举报
0/150
提交
取消