python 使用进程池并发执行 SQL 语句

        这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理,绕过 Python 的全局解释器锁(GIL)限制,从而在多核 CPU 上并发执行多个 SQL 语句。

from pyhive import hive
import multiprocessing# 建立连接
conn = hive.Connection(host="localhost", port=10000, username="your_username", password="your_password")# SQL 语句列表
sql_statements = ["INSERT INTO table1 VALUES (1, 'value1')","INSERT INTO table1 VALUES (2, 'value2')","INSERT INTO table1 VALUES (3, 'value3')"
]# 定义执行函数
def execute_sql(sql):with conn.cursor() as cursor:cursor.execute(sql)# 确保多进程代码只在主进程中执行
if __name__ == '__main__':# 使用进程池并发执行with multiprocessing.Pool() as pool:pool.map(execute_sql, sql_statements)# 关闭连接conn.close()

1. 导入模块

from pyhive import hive
import multiprocessing
  • pyhive: 这是用于连接和操作 Hive 数据库的 Python 库。hive.Connection 用于建立与 Hive 数据库的连接。
  • multiprocessing: 这是 Python 的标准库,用于创建和管理进程。通过 multiprocessing,我们可以绕过 Python 的 GIL(全局解释器锁)限制,实现真正的并行处理。

2. 建立数据库连接

conn = hive.Connection(host="localhost", port=10000, username="your_username", password="your_password")
  • 这里我们使用 hive.Connection 建立一个到 Hive 数据库的连接。
  • 参数
    • host: HiveServer2 的主机地址,通常是 localhost 或 HiveServer2 运行的服务器 IP。
    • port: HiveServer2 的端口号,默认是 10000
    • username: 连接 Hive 使用的用户名。
    • password: 连接 Hive 使用的密码。

这个连接对象 conn 将在后续的代码中用于创建游标(cursor),并通过游标执行 SQL 语句。

3. 定义 SQL 语句列表

sql_statements = ["INSERT INTO table1 VALUES (1, 'value1')","INSERT INTO table1 VALUES (2, 'value2')","INSERT INTO table1 VALUES (3, 'value3')"
]
  • 这里定义了一个包含多个 SQL 语句的列表 sql_statements。每个语句都是一个插入操作,将数据插入到 Hive 表 table1 中。
  • 你可以根据实际需求修改这些 SQL 语句。

4. 定义执行函数

def execute_sql(sql):with conn.cursor() as cursor:cursor.execute(sql)
  • execute_sql 函数是用于执行单个 SQL 语句的函数。
  • with conn.cursor() as cursor:为当前数据库连接创建一个游标对象 cursor,这个游标用于执行 SQL 语句。
    • cursor.execute(sql):执行传入的 SQL 语句。
  • 这个函数会被进程池中的每个进程调用,每个进程都会独立执行一个 SQL 语句。

5. 使用进程池并发执行

with multiprocessing.Pool() as pool:pool.map(execute_sql, sql_statements)
  • multiprocessing.Pool():创建一个进程池。进程池可以管理一组工作进程,并将任务分配给这些进程。
    • 默认情况下,Pool() 会根据系统的 CPU 核心数创建相应数量的工作进程。
    • 你可以通过参数指定池中的进程数量,例如 Pool(4) 表示创建 4 个工作进程。
  • pool.map(execute_sql, sql_statements)
    • pool.map 方法会将 execute_sql 函数应用到 sql_statements 列表中的每个元素上。
    • pool.map 方法会自动将 SQL 语句列表分配给进程池中的工作进程,每个进程独立执行一个 SQL 语句。
    • 这个过程是并行的,多个进程可以同时执行不同的 SQL 语句,从而提高执行效率。

6. 关闭数据库连接

conn.close()
  • 在所有 SQL 语句执行完毕后,我们关闭数据库连接,释放资源。

进程池的工作原理

multiprocessing.Pool 提供了一种方便的方式来并行化执行函数。其工作原理如下:

  1. 创建进程池:当你创建一个 Pool 对象时,会启动多个工作进程(数量可以指定,或默认根据 CPU 核心数决定)。
  2. 任务分配:当你调用 pool.map 时,进程池会将任务(在这里是 execute_sql 函数)分配给空闲的工作进程。
  3. 并行执行:每个工作进程独立执行分配给它的任务,互不干扰。
  4. 结果收集pool.map 会收集所有工作进程的执行结果,并按照原始任务列表的顺序返回结果。

为什么使用进程池而不是线程池?

  1. GIL 限制:Python 的全局解释器锁(GIL)限制了多线程的并行执行能力,尤其是在 CPU 密集型任务中,多线程并不能充分利用多核 CPU。
  2. 进程并行multiprocessing 模块通过创建多个进程来绕过 GIL 限制,每个进程都有自己的 Python 解释器和内存空间,因此可以实现真正的并行执行。
  3. 适用场景
    • 线程池:适合 I/O 密集型任务(例如,等待数据库查询结果)。
    • 进程池:适合 CPU 密集型任务(例如,并行计算、数据处理等),或者你需要绕过 GIL 限制时。

注意事项

  1. 数据库连接:在多进程环境中,每个进程都有自己的内存空间,因此每个进程需要独立的数据库连接。在上述代码中,每个进程都通过 conn.cursor() 创建了自己的游标。
  2. 进程开销:创建和销毁进程有一定的开销,因此对于非常短小的任务,进程池可能不会显著提高性能。在这种情况下,可以考虑调整进程池的大小或使用其他优化手段。
  3. 连接池:如果你的程序需要频繁访问数据库,可以考虑使用数据库连接池来复用数据库连接,减少连接建立和关闭的开销。

总结

  • 进程池:通过 multiprocessing.Pool 实现,可以绕过 Python 的 GIL 限制,实现真正的并行处理。
  • 适用场景:适合 CPU 密集型任务或需要并行执行多个独立任务的场景。
  • 代码结构
    • 建立数据库连接。
    • 定义 SQL 语句列表。
    • 定义执行函数 execute_sql
    • 使用进程池并发执行 SQL 语句。
    • 关闭数据库连接。

通过这种方式,你可以充分利用多核 CPU 的优势,并发执行多个 SQL 语句,从而提高程序的执行效率。

解决多进程报错

你遇到的错误是 RuntimeError,这是因为你在使用 multiprocessing 时没有正确地保护代码的入口点。具体来说,在 Windows 系统上(以及其他非 fork 的启动方式),你必须将多进程相关的代码放在 if __name__ == '__main__': 语句块中,以避免子进程在启动时重新导入主模块并执行不必要的代码。

错误原因:

在 Windows 系统中,Python 的 multiprocessing 模块使用 spawn 启动子进程,这意味着子进程会重新导入当前脚本。如果不加以保护,子进程会再次执行主模块中的代码,导致递归创建进程并抛出错误。

解决方案:

你需要将多进程相关的代码放在 if __name__ == '__main__': 语句块中,确保只有主进程会执行这些代码,而子进程不会。

修改后的代码:

 

python

import multiprocessingdata = ["1","2","3"
]# 定义执行函数
def print_str(data):print(data)# 确保多进程代码只在主进程中执行
if __name__ == '__main__':# 使用进程池并发执行with multiprocessing.Pool() as pool:pool.map(print_str, data)

解释:

  • if __name__ == '__main__': 确保了只有在直接运行当前脚本时,才会执行其中的多进程代码。子进程不会执行这个代码块,从而避免了递归创建进程的问题。
  • 在 Windows 系统上,这是使用 multiprocessing 时必须遵循的惯用写法。

其他注意事项:

  • 如果你打算将脚本打包成可执行文件(例如使用 pyinstaller),你还需要调用 multiprocessing.freeze_support(),不过在大多数脚本运行的情况下,这个调用不是必须的。

例如:

 

python

if __name__ == '__main__':multiprocessing.freeze_support()  # 如果需要打包成可执行文件,可以加上这行with multiprocessing.Pool() as pool:pool.map(print_str, data)

参考文档:

你可以参考 Python 官方文档中关于 multiprocessing 的部分,了解更多关于安全导入主模块的信息:

  • multiprocessing — Process-based parallelism — Python 3.13.0 documentation

执行sql 简单示例

import multiprocessingdata = [  ]# 定义执行函数
def print_str(data):print(data)# 确保多进程代码只在主进程中执行
if __name__ == '__main__':data2 = ["1","2","3"]for i in data2:data_str = f"""inset into {i}"""data.append(data_str)# 使用进程池并发执行with multiprocessing.Pool() as pool:pool.map(print_str, data)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463964.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot+VUE2完成WebSocket聊天(数据入库)

下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…

电子电气架构 --- 车载诊断的快速入门

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

继承的内容

封装&#xff1a; 1.在类中&#xff0c;把数据和方法放在一起&#xff0c;只展示成员函数&#xff0c;不展示定义的数据为私有。 2.一个类型放到另一个类型里面&#xff0c;通过typedef成员函数调整&#xff0c;封装另一个全新的类型。相当于是一个包装。 继承&#xff1a; st…

设计模式之结构型模式---装饰器模式

目录 1.概述2.类图3.应用场景及优缺点3.1 应用场景3.2 优缺点3.2.1 优点3.2.2 缺点 4.实现4.1 案例类图4.2 代码实现4.2.1 定义抽象构建角色4.2.2 定义具体构建角色4.2.3 定义抽象装饰器角色4.2.4 定义具体装饰角色4.2.5 装饰器模式的使用 1.概述 装饰器模式是指在不改变现有对…

接口测试(十一)jmeter——断言

一、jmeter断言 添加【响应断言】 添加断言 运行后&#xff0c;在【察看结果树】中可得到&#xff0c;响应结果与断言不一致&#xff0c;就会红色标记

vue-i18n国际化多国语言i18n国际语言代码对照表

uniapp是自带有i18n这个插件 需要自己去给每一个需要国际化的字符去手动配置key&#xff0c;所以如果是已经完成的项目可能工作量就稍微有点大了 第一步&#xff1a; 语言命名是有规范的不能乱取名&#xff0c;具体可以参考国际语言代码 i18n国际语言代码对照表 zh_CN 中文(简体…

GitHub | 发布到GitHub仓库并联文件夹的方式

推送到Github 推送步骤如果你只想更新单个文件&#xff0c;只需在第 4 步中指定该文件的路径即可。可能问题一 效果 推送步骤 更新 GitHub 仓库中的文件通常涉及以下步骤&#xff1a; 克隆仓库&#xff1a; 首先&#xff0c;你需要将 GitHub 上的仓库克隆到本地。使用 git …

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

杂货 | 每日资讯 | 2024.11.1

注意&#xff1a;以下内容皆为AI总结 2024年11月1日&#xff0c;人工智能&#xff08;AI&#xff09;领域发生了多项重要事件&#xff0c;标志着技术发展的新阶段。本文将详细探讨以下三大事件&#xff1a; OpenAI为ChatGPT新增搜索功能IEEE发布《2025年及以后的技术影响》报…

RuoYi 样例框架运行步骤(测试项目自用,同学可自取)

目录 后台 API 运行导入&#xff0c;下载包端口号mysql 准备运行 PC&#xff08;电脑端&#xff09;运行安装 nodejs安装 yarn 及其依赖&#xff0c;启动服务登录admin(admin123) 或 ry(admin123) App&#xff08;移动&#xff09;运行下载 HBuilderX运行app运行注意&#xff1…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域&#xff0c;流量和搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统&#xff0c;旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为&#xff0c;优化关键词排名&#xff0c;并…

项目解决方案:跨不同的物理网络实现视频监控多画面的实时视频的顺畅访问

目录 一、碰到的需求问题 二、需求分析 三、方案分析 &#xff08;一&#xff09;方法1&#xff1a;使用HTTP代理 1. 安装HTTP代理服务器 2. 配置Nginx代理 3. 重启Nginx 4. 访问视频流 &#xff08;二&#xff09;方法2&#xff1a;使用反向代理 1. 安装反向代理服务…

MQTT自动发送消息工具(自动化测试MQTT)

点击下载《MQTT客户端服务端工具》 点击下载《MQTT自动发送消息软件(自动化测试MQTT)》 1. 前言 在软件开发过程中&#xff0c;MQTT常被用作消息队列来完成特定的业务功能。当我们将相关业务代码编写完成后&#xff0c;通常需要编写额外的消息生产和消费代码来模拟消息高峰时…

东北虎豹国家公园shp格式范围

东北虎豹国家公园地处中国吉林、黑龙江两省交界的老爷岭南部&#xff08;珲春—汪清—东宁—绥阳&#xff09;区域&#xff0c;东起吉林省珲春林业局青龙台林场&#xff0c;与俄罗斯滨海边疆区接壤&#xff0c;西至吉林省大兴沟林业局岭东林场&#xff0c;南自吉林省珲春林业局…

练习LabVIEW第三十七题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十七题&#xff1a; 利用XY GRAPH 构成李萨如图形 开始编写&#xff1a; 前面板放一个XY图控件&#xff0c;程序框图…

Pandas 数据可视化指南:从散点图到面积图的全面展示

Pandas 数据可视化指南&#xff1a;从散点图到面积图的全面展示 本文介绍了使用 Pandas 进行数据可视化的多种方法&#xff0c;包括散点图、折线图、条形图、直方图、饼图和面积图等&#xff0c;涵盖了常见的图表类型及其实现方式。通过提供详细的代码示例&#xff0c;展示了如…

Solana链上的Pump狙击机器人与跟单机器人的工作原理及盈利模式

随着加密货币市场的快速发展&#xff0c;越来越多的投资者和开发者开始关注Solana链上的自动化交易工具。尤其是Pump狙击机器人和跟单机器人&#xff0c;这两种工具为用户提供了在市场波动中获取利润的机会。本文将深入分析这两种机器人的工作原理及其盈利模式。 一、Pump狙击机…

嵌入式操作系统FreeRTOS

系列文章目录 嵌入式操作系统FreeRTOS 嵌入式操作系统FreeRTOS 系列文章目录一、FreeRTOS 一、FreeRTOS 首先看一下 FreeRTOS 的名字&#xff0c;可以分为两部分&#xff1a;“Free”和“RTOS”&#xff0c;“Free”就是免费的、自由的、不受约束的意思&#xff0c;“RTOS”全…

客如云:大型业务报表的分区化改造提升性能|OceanBase 应用实践

一 概述 1 背景 在过去两到三年的时间里&#xff0c;客如云的KPOS产品在商户数量和订单量均实现了数倍的增长&#xff0c;充分展示了产品的市场吸引力和业务模式的成功。然而&#xff0c;随着更多的大型连锁商户的加入&#xff0c;客如云商家平台迎来了前所未有的挑战。特别是…

Vue2指令原理手写

文件结构 index.js /** Author: RealRoad* Date: 2024-10-31 17:13:50* LastEditors: Do not edit* LastEditTime: 2024-10-31 17:15:57* Description: * FilePath: \project_10_08\vite-project\src\testVue\index.js*/ import Vue from ./Vue.js window.VueVue Vue.js imp…