为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用多处理池和 cx_oracle 运行并行查询

如何使用多处理池和 cx_oracle 运行并行查询

海绵宝宝撒 2022-10-06 19:36:13
我正在尝试使用 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()

从数据库中获取数据后,如果您有大量工作要做,您可以通过多处理将获取的数据传递给子进程来完成这项工作。您不能在子进程中执行任何数据库工作——至少在没有首先连接该子进程的情况下是这样。


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信