如何让python程序同时向数据库发送多个请求,而不需要等待响应发送下一个?

问题描述 投票:0回答:1

我正在尝试制作一个与外部数据输入相匹配的Python程序,以记录在我的数据库中,该数据库位于我组织中的另一台服务器上。

问题是我一次获取数百万条记录,程序每匹配 100 万条记录需要 4 个小时,而且几乎没有 CPU 使用率。

我已经在程序的每个部分设置了计时器来测试,除了通过ODBC与数据库交互的部分之外,它的速度非常快,那么我该如何做诸如多处理或多线程之类的事情来加速程序并进行循环重新开始而不停止等待数据库响应将其写入文件然后继续循环?

基本上,当遇到停机时间等待数据库响应以立即执行下一次迭代时,我需要循环的每次迭代,然后返回到正确的位置,将获取的数据写入文件(或将它们附加到列表中),同时进行其他迭代同一循环也在等待 Db 响应。

提前致谢。

这就是代码现在的样子

def run_query(DbConn, match_data):
    for record in match_data:
        stmt = ibm_db.prepare(DbConn, f"select trim(Name) || ' ' || trim(FTHFNAME) || ' ' || trim(FTHSNAME) || ' ' || trim(FTHTNAME) AS NAME, BIRTHDATE, IDNUMSTAT PEOPLE where NAME = ? with ur;", {ibm_db.SQL_ATTR_CURSOR_TYPE:3})
        ibm_db.bind_param(stmt, 1, f"{record['NAME']}")
        try:
            ibm_db.execute(stmt)
        except Exception:
            print(ibm_db.stmt_errormsg(stmt))
            ibm_db.close(DbConn)
            sys.exit("Closed duo to an error")
        if ibm_db.fetch_assoc(stmt, 1):
            print("Matched")
            print_row_to_csv(ibm_db.fetch_assoc(stmt, 1))
        else:
            print("Not matched")
            print_row_to_csv({"Not Matched": "Not found"}) 
        
python python-3.x database python-multiprocessing python-multithreading
1个回答
0
投票

不要在循环中对单个数据执行查询,而是将数据捆绑在一起(假设 10000 个或更多)并在查询中一起执行。并对单独的包执行查询。 这将帮助您在集群中执行大数据,而不是进行数千次查询。 如果可以的话,还可以在循环外准备一次查询并在循环内绑定_params。

© www.soinside.com 2019 - 2024. All rights reserved.