亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用多處理池和 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 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號