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
相关产品推荐
相关产品推荐

