You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何创建并行进程,实现SELECT与INSERT无等待执行?

解决Python多进程并行执行SELECT与INSERT的问题

修改后的核心代码

import time
from multiprocessing import Process
import psycopg2  # 假设使用psycopg2连接PostgreSQL

def get_db_connection():
    # 封装数据库连接创建逻辑,供各进程独立调用
    return psycopg2.connect(
        dbname="你的数据库名",
        user="你的用户名",
        password="你的密码",
        host="你的数据库地址"
    )

def select_func():
    conn = get_db_connection()
    with conn.cursor() as cursor:
        query = "SELECT * FROM myTable WHERE \"UserName\" = 'Alice'"
        start = time.time()
        cursor.execute(query)
        results = cursor.fetchall()
        end = time.time()
        # 启动子进程执行INSERT操作,不等待其完成
        process = Process(target=insert_func, args=(query, end - start))
        process.start()
    conn.close()
    return results
        
def insert_func(query, exec_time):
    conn = get_db_connection()
    with conn.cursor() as cursor:
        # 使用参数化查询避免SQL注入,同时兼容特殊字符
        insert_query = """
            INSERT INTO infoTable ("query", "exec_time")
            VALUES (%s, %s)
        """
        cursor.execute(insert_query, (query, exec_time))
        conn.commit()
    conn.close()

关键修改说明

  • 移除process.join():这是导致select_func等待insert_func执行完毕的直接原因。去掉后子进程会在后台独立运行,select_func可立即返回查询结果,不影响后续函数调用。
  • 子进程独立创建数据库连接:多进程不能共享同一个数据库连接对象,否则会引发连接状态混乱、资源竞争等问题。每个进程必须通过get_db_connection()单独创建专属连接。
  • 替换字符串拼接为参数化SQL:原代码直接拼接SQL存在严重的SQL注入风险,还无法处理查询语句中的特殊字符(比如引号)。使用%s作为占位符传递参数,是PostgreSQL官方推荐的安全写法。
  • 显式关闭数据库连接:主进程和子进程用完连接后都要显式关闭,避免连接泄漏。

额外优化建议

如果需要频繁启动这类INSERT子进程,可以考虑使用multiprocessing.Pool维护进程池,减少频繁创建销毁进程的开销;或者改用threading.Thread,因为数据库IO属于IO密集型操作,线程的资源开销比进程更小,同样能实现并行效果(注意线程中也要保证连接的独立性)。

内容的提问来源于stack exchange,提问作者Jasmine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:25:17