如何使用多处理池和 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(),但它会抛出同样的错误


海绵宝宝撒
浏览 161回答 1
1回答

白衣非少年

进程之间不能共享连接。但是,您可以使用如下代码在同一进程中执行并行查询: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()从数据库中获取数据后,如果您有大量工作要做,您可以通过多处理将获取的数据传递给子进程来完成这项工作。您不能在子进程中执行任何数据库工作——至少在没有首先连接该子进程的情况下是这样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python