python 进程池的基本使用
Python 进程池:Pool任务调度实现
在现代计算机系统重,处理器核心数量的增加为并行计算提供了强大的硬件基础。Python的 multiprocessing 模块中的进程池(Pool)机制,为开发者提供了
一个高效且易用的并行处理框架。
通过进程池,可以轻松地将计算密集型任务分配到多个处理器核心上执行,显著提升程序的执行效率。
进程池是一种预先创建多个进程实例的并行处理机制。它通过维护一组工作进程,避免了频繁创建和销毁进程带来的系统开销。当有新的任务需要执行时,进程池会自动
将任务分配给空闲的工作进程,实现任务的并行处理。这种机制特别适合需要重复执行相似任务的场景,如批量数据处理、并行计算等。
1. 任务调度原理
1.1 任务分配机制
Pool 的任务调度采用了工作队列模式,它维护了一个任务队列和结果队列。当我们提交任务时,任务会被放入任务队列;工作进程会从队列中获取任务并执行,执行结果则
被放入结果队列。这个过程是自动进行的,开发者无需关系具体的调度细节。
1.2. 进程池管理策略
进程池在创建时就会初始化指定数量的工作进程,这些进程在整个池的生命周期内持续存在。当某个进程在执行任务时发生异常,进程池会自动创建新的进程来替代它,
确保可用进程数量的稳定性。
from multiprocessing import Pool
import time
import osdef work_function(x):"""工作函数:模拟耗时计算任务"""print(f"进程 {os.getpid()} 开始处理任务 {x}")time.sleep(3)result = x * xprint(f"进程 {os.getpid()} 完成任务 {x}")return resultdef main():# 创建进程池,使用4个工作进程with Pool(4) as pool:tasks = range(10)# 使用 map 方法并行处理任务results = pool.map(work_function, tasks)print("所有任务完成,结果:", results)if __name__ == '__main__':
1.3 高级任务提交方法
1.3.1 异步任务处理
除了同步的map 方法,Pool还提供了异步任务的提交方式。
通过apply_async 和 map_async方法,可以实现更灵活的任务调度:
from multiprocessing import Pool
import time
import osdef long_time_task(name):"""模拟长时间运行的任务"""print(f"运行任务 {name} ({os.getpid()})")time.sleep(2)return f"任务 {name} 的结果"def process_async_tasks():with Pool(4) as pool:# 使用 apply_async 提交多个任务results = []for i in range(5):result = pool.apply_async(long_time_task, args=(i,))results.append(result)# 获取所有任务结果for result in results:print(f"获取结果:", result.get(timeout=3))if __name__ == '__main__':start_time = time.time()process_async_tasks()end_time = time.time()print(f"总执行时间: {end_time - start_time:.2f}秒")
1.3.2 任务回调机制
Pool 支持异步任务设置回调函数,这在处理任务完成后的后续操作时非常有用:
from multiprocessing import Pool
import time
import osdef task(x):"""执行主要计算任务"""time.sleep(1)return x * xdef callback_func(result):"""任务完成后的回调函数"""print(f"任务完成,结果为:{result}")def main_with_callback():with Pool(3) as pool:for i in range(5):pool.apply_async(task, args=(i,),callback = callback_func)# 等待所有任务完成pool.close()pool.join()if __name__ == '__main__':start_time = time.time()main_with_callback()end_time = time.time()print(f"总执行时间: {end_time - start_time:.2f}秒")
2.实际应用场景
2.1 批量文件处理系统
from multiprocessing import Pool
import time
import osdef task(x):"""执行主要计算任务"""time.sleep(1)return x * xdef callback_func(result):"""任务完成后的回调函数"""print(f"任务完成,结果为:{result}")def main_with_callback():with Pool(3) as pool:for i in range(5):pool.apply_async(task, args=(i,),callback = callback_func)# 等待所有任务完成pool.close()pool.join()if __name__ == '__main__':start_time = time.time()main_with_callback()end_time = time.time()print(f"总执行时间: {end_time - start_time:.2f}秒")
3.性能优化
进程数量的选择对性能有重要影响。一般建议将进程数设置为CPU核心数或略高于核心数。但在IO密集型任务中,可以适当增加进程数。过多的进程反而会因为上下文切换导致性能下降。
对于不同类型的任务,应选择合适的任务提交方式。计算密集型任务适合使用map方法,而IO密集型任务可能更适合使用apply_async。这是因为map方法会阻塞等待所有任务完成,而apply_async允许更灵活的任务调度。
在处理大量小任务时,应考虑任务分块来减少调度开销。可以将多个小任务合并为一个大任务,减少进程间通信的次数:
from multiprocessing import Pool
import timedef process_chunk(chunk):"""处理一组任务"""return [x * x for x in chunk]def chunked_processing(data, chunk_size=1000):# 将数据分块chunks = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)]with Pool() as pool:# 处理数据块results = pool.map(process_chunk, chunks)# 合并结果return [item for sublist in results for item in sublist]# 使用示例
if __name__ == '__main__':large_data = range(10000)result = chunked_processing(large_data)
相关文章:
python 进程池的基本使用
Python 进程池:Pool任务调度实现 在现代计算机系统重,处理器核心数量的增加为并行计算提供了强大的硬件基础。Python的 multiprocessing 模块中的进程池(Pool)机制,为开发者提供了 一个高效且易用的并行处理框架。 通…...
从零开始学 Rust:基本概念——变量、数据类型、函数、控制流
文章目录 Variables and MutabilityShadowing Data TypesScalar TypesCompound Types FunctionsFunction Parameters CommentsControl FlowRepetition with Loops Variables and Mutability fn main() {let mut x 5;println!("The value of x is: {}", x);x 6;pri…...

记录一次SpringMVC的406错误
原生态的406错误 1. 错误起因2. 解决办法解决方式一 检查是否有导入jackson依赖解决方式二 检查web.xml中是否有配置.html 3. 再次测试 1. 错误起因 最近博主准备重新撸一遍SSM以及SpringBoot的源码,于是用原始的SpringMVC写了一个demo,并且用Tomcat进行…...

Github 2025-02-23 php开源项目日报 Top9
根据Github Trendings的统计,今日(2025-02-23统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9JavaScript项目2Shell项目1TypeScript项目1Blade项目1Java项目1ASP项目1Vue项目1Laravel:表达力和优雅的 Web 应用程序框架 创建周期:…...

一、初始爬虫
1.爬虫的相关概念 1.1 什么是爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地爬取互联网信息的程序。 原则上,只要是浏览器…...

《A++ 敏捷开发》- 16 评审与结对编程
客户:我们的客户以银行为主,他们很注重质量,所以一直很注重评审。他们对需求评审、代码走查等也很赞同,也能找到缺陷,对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。 我:你听说过敏捷的结对…...
jar、war、pom
1. <packaging>jar</packaging> 定义与用途 用途:默认打包类型,生成 JAR 文件(Java Archive),适用于普通 Java 应用或库。 场景: 开发工具类库(如 commons-lang.jar)。…...

WSL2安装过程记录
WSL2安装过程记录 1 先决条件2 安装WSL3 安装Linux4 图形化界面 因为命令安装的时候会直接将linux发行版安装到C盘,对于系统盘容量小和介意不能自定义安装位置的用户来说,非常不友好,所以我这里采用手动安装的方式, 命令安装可以参…...
HTML列表,表格和表单
列表 在 HTML 中,列表(List)是常见的一种布局方式。列表分为两种类型:有序列表(Ordered List)和无序列表(Unordered List)。 无序列表 无序列表(Unordered List&#…...
Mysql进阶篇
存储引擎 Mysql体系结构 1). 连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全…...
Spring-JAVA
针对你的问题(211本科、Java开发方向),以下是中级Java开发工程师的晋升时间、薪资水平及技术要求的详细说明,结合国内一线/二线城市现状(数据基于2023年行业调研): 一、晋升中级开发工程师的时间…...

sql的索引与性能优化相关
之前面试的时候,由于在简历上提到优化sql代码,老是会被问到sql索引和性能优化问题,用这个帖子学习记录一下。 1.为什么要用索引 ------------------------------------------------------------------------------------------------------…...

【Git版本控制器】第四弹——分支管理,合并冲突,--no-ff,git stash
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 相关笔记: https://blog.csdn.net/djd…...
Elasticsearch除了用作查找以外,还能可以做什么?
前言 Elasticsearch用于实时数据分析、日志存储、业务智能等。还有日志与监控、多租户和安全性。以及应用场景包括日志分析、公共数据采集、全文搜索、事件数据、数据可视化。处理错误拼写和支持变体,不过这些可能还是属于搜索优化。企业搜索、日志管理、应用监控、…...
Gradio全解11——使用transformers.agents构建Gradio UI(6)
大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(6) 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.6 通过agents构建Gradio UI11.6.1 ChatMessage数据类1. 数据结构2. 例程11.6.2 构建Gradio UI示例1. 代码及运行2. 代码解读参考文献前言 本…...
自定义实现简版状态机
状态机(State Machine)是一种用于描述系统行为的数学模型,广泛应用于计算机科学、工程和自动化等领域。它通过定义系统的状态、事件和转移来模拟系统的动态行为。 基本概念 状态(State):系统在某一时刻的特…...

算法常见八股问题整理
1.极大似然估计和交叉熵有什么关系 在分类问题中,当我们使用softmax函数作为输出层时,最大化对数似然函数实际上等价于最小化交叉熵损失函数。具体来说,在多分类情况下,最大化该样本的对数似然等价于最小化该样本的交叉熵损失。 交…...
关于GeoPandas库
geopandas buildings gpd.read_file(shapefile_path) GeoDataFrame 对象有一个属性叫做 sindex 空间索引通常是基于 R-树 或其变体构建的,这些数据结构专为空间查询优化,可以显著提高查询效率,尤其是在处理大型数据集时。 buildings_sin…...

【漫话机器学习系列】103.学习曲线(Learning Curve)
学习曲线(Learning Curve)详解 1. 什么是学习曲线? 学习曲线(Learning Curve)是机器学习和深度学习领域中用于评估模型性能随训练过程变化的图示。它通常用于分析模型的学习能力、是否存在过拟合或欠拟合等问题。 从…...

电商运营中私域流量的转化与变现:以开源AI智能名片2+1链动模式S2B2C商城小程序为例
摘要 电商运营的核心目标在于高效地将产品推向市场,实现私域流量的转化和变现。本文以“罗辑思维”的电商实践为背景,探讨了私域流量变现的重要性,并深入分析了开源AI智能名片21链动模式S2B2C商城小程序在电商运营中的应用与价值。通过该模式…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...