python入门开发学习笔记之掌握进程池与线程池的用法

python线程池与进程池基础学习 阅读详情

本节重点

掌握进程池与线程池的用法
掌回调函数
本节时长需控制在30分钟内

一 进程池与线程池

在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程数或线程数加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途,例如进程池,就是用来存放进程的池子,本质还是基于多进程,只不过是对开启进程的数目加上了限制

介绍

官网:https://docs.python.org/dev/library/concurrent.futures.html

concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor:线程池,提供异步调用
ProcessPoolExecutor: 进程池,提供异步调用
Both implement the same interface, which is defined by the abstract Executor class.

基本方法

1、submit(fn, *args, **kwargs)
异步提交任务

2、map(func, *iterables, timeout=None, chunksize=1) 
取代for循环submit的操作

3、shutdown(wait=True) 
相当于进程池的pool.close()+pool.join()操作
wait=True,等待池内所有任务执行完毕回收完资源后才继续
wait=False,立即返回,并不会等待池内的任务执行完毕
但不管wait参数为何值,整个程序都会等到所有任务执行完毕
submit和map必须在shutdown之前

4、result(timeout=None)
取得结果

5、add_done_callback(fn)
回调函数

二 进程池

介绍

The ProcessPoolExecutor class is an Executor subclass that uses a pool of processes to execute calls asynchronously. ProcessPoolExecutor uses the multiprocessing module, which allows it to side-step the Global Interpreter Lock but also means that only picklable objects can be executed and returned.

class concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None)
An Executor subclass that executes calls asynchronously using a pool of at most max_workers processes. If max_workers is None or not given, it will default to the number of processors on the machine. If max_workers is lower or equal to 0, then a ValueError will be raised.

用法

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

import os,time,random
def task(n):
    print('%s is runing' %os.getpid())
    time.sleep(random.randint(1,3))
    return n**2

if __name__ == '__main__':

    executor=ProcessPoolExecutor(max_workers=3)

    futures=[]
    for i in range(11):
        future=executor.submit(task,i)
        futures.append(future)
    executor.shutdown(True)
    print('+++>')
    for future in futures:
        print(future.result())

三 线程池

介绍

ThreadPoolExecutor is an Executor subclass that uses a pool of threads to execute calls asynchronously.
class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='')
An Executor subclass that uses a pool of at most max_workers threads to execute calls asynchronously.

Changed in version 3.5: If max_workers is None or not given, it will default to the number of processors on the machine, multiplied by 5, assuming that ThreadPoolExecutor is often used to overlap I/O instead of CPU work and the number of workers should be higher than the number of workers for ProcessPoolExecutor.

New in version 3.6: The thread_name_prefix argument was added to allow users to control the threading.Thread names for worker threads created by the pool for easier debugging.

用法

把ProcessPoolExecutor换成ThreadPoolExecutor,其余用法全部相同

四 map方法

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

import os,time,random
def task(n):
    print('%s is runing' %os.getpid())
    time.sleep(random.randint(1,3))
    return n**2

if __name__ == '__main__':

    executor=ThreadPoolExecutor(max_workers=3)

    # for i in range(11):
    #     future=executor.submit(task,i)

    executor.map(task,range(1,12)) #map取代了for+submit

五 回调函数

可以为进程池或线程池内的每个进程或线程绑定一个函数,该函数在进程或线程的任务执行完毕后自动触发,并接收任务的返回值当作参数,该函数称为回调函数

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
from multiprocessing import Pool
import requests
import json
import os

def get_page(url):
    print('<进程%s> get %s' %(os.getpid(),url))
    respone=requests.get(url)
    if respone.status_code == 200:
        return {'url':url,'text':respone.text}

def parse_page(res):
    res=res.result()
    print('<进程%s> parse %s' %(os.getpid(),res['url']))
    parse_res='url:<%s> size:[%s]\n' %(res['url'],len(res['text']))
    with open('db.txt','a') as f:
        f.write(parse_res)


if __name__ == '__main__':
    urls=[
        'https://www.baidu.com',
        'https://www.python.org',
        'https://www.openstack.org',
        'https://help.github.com/',
        'http://www.sina.com.cn/'
    ]

    p=ProcessPoolExecutor(3)
    for url in urls:
        p.submit(get_page,url).add_done_callback(parse_page) #parse_page拿到的是一个future对象obj,需要用
深入理解进程与线程、进程池与线程池:企业级开发实战指南 程与线程是操作系统进行资源管理和任务执行的基本单位。进程拥有独立的地址空间,适合高隔离任务;线程共享进程资源,适合频繁切换或I/O密集型任务。线程池通过复用线程减少创建销毁开销,适合处理I/O密集型任务;进程池通过复用进程提供更高隔离性,适合处理计算密集型任务。 阅读详情

相关推荐

【python内功修炼011】:Python进程池和线程池详解

文章目录一、关于线程池\进程池介绍1.1 池的概念1.2 池的划分1.3 线程池和进程池的区别1.5 进程池的创建(流程)二、创建线程池\进程池的两种方法2.1 concurrent和multiprocessing区别三、concurrent.futures模块3.1 模块的介绍3.2 Executor.submit 创建进程/线程池四、concurrent.futures 常用模块4.1 Exe...

金鞍少年的博客 1106

Python线程池、进程池的介绍与使用

 最近在做的一个项目是用python同时给多个用户提供科学计算。为了最大化并行服务的用户数量,需要用到多进程;为了最大化多个用户使用的公平性,需要用到多线程。

m0_50596083的博客 5245

解锁 Python 并发的力量:线程池与进程池的实用指南

本文介绍了Python中线程池与进程池的机制及应用。线程池适合I/O密集型任务,如网络请求,而进程池适合CPU密集型任务,如数据分析。文章通过代码示例展示了如何使用concurrent.futures模块实现两者的并发处理,并对比了它们的优缺点。此外,还提供了使用场景选择指南和常见问题优化策略,帮助开发者根据任务类型合理选择并发方案,提升程序性能。

铭渊老黄 729

Python中线程、进程与异步的介绍和实现(非常详细,例子多多、注解多多,值得大家参考借鉴)

一文讲透python高性能编程

nfkjdx的博客 2345

《全面解析 Python 的线程池与进程池:`ThreadPoolExecutor` vs `ProcessPoolExecutor`》

摘要: Python 的 concurrent.futures 模块提供了 ThreadPoolExecutor(线程池)和 ProcessPoolExecutor(进程池)两种并发执行器。线程池轻量高效,适合 I/O 密集型任务(如网络请求),但受限于 GIL;进程池能绕过 GIL,实现真正并行,适合 CPU 密集型任务(如矩阵运算),但开销较大。实际应用中需根据任务类型选择:I/O 密集用线程池,CPU 密集用进程池。优化建议包括分类任务、合理设置并发数及处理异常。两者结合可高效完成复杂任务,如用线程池

铭渊老黄 647

【Python】深入理解Python的多进程与多线程池:并行计算的核心技术

在现代计算中,并行处理是提升性能的重要方式。Python 通过多进程和多线程提供了灵活的并发支持,其中进程池和线程池是常用的工具。`concurrent.futures` 模块进一步简化了多进程和多线程的使用,为开发者提供了高效且易用的并行计算接口。本文将深入解析 Python 的多进程与多线程池的实现原理及用法,并结合实际场景,展示如何通过线程池和进程池处理计算密集型和 IO 密集型任务。我们还将探讨其性能特点、调优技巧以及注意事项。通过大量代码示例,帮助读者掌握这些工具的最佳实践,为编写高效的并发程序奠

一个被知识诅咒的人 1069

线程池&进程池(笔记)

一、池化技术 在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能。对象池通过复用对象来减少创建对象、垃圾回收的开销。 二、线程池和进程池(原理相近,以下是线程池的创建和应用) 1、线程池是什么 创建销毁线程是一个非常消耗性能的,而线程池其实就是一个 容纳多个线程的容器 ,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。线程池需要一个管理者来管理线程的分配和使用。 2、线程池的应用 ...

m0_57105760的博客 297

Python教程:Python线程池与进程池入门

在 Python 开发中,进行并发编程是一项非常重要的技能。无论是在处理 I/O 密集型任务还是计算密集型任务,合理使用线程池和进程池都能显著提高程序的性能和响应速度。本篇博客将详细介绍线程池和进程池的基本概念、使用方法及实战示例,帮助大家更好地理解和掌握这两种并发编程的技术。

旦莫的博客 1564

Python3中线程池和进程池的基本用法

系列文章目录 文章目录系列文章目录前言一、python3线程的基本用法1.1 函数调用方法1.2 类包装对象二、线程池的用法三.进程的用法3.1 进程使用实例3.2 进程池使用实例参考文章 前言 学习python3中线程池的用法鱼进程池的用法 一、python3线程的基本用法 Python中使用线程有两种方式:函数或者用类来包装线程对象 1.1 函数调用方法 thread.start_new_thread ( function, args[, kwargs] ) 参数说明: functi

u014265398的博客 567

python 线程池,进程池

网上关于python 的线程池,进程池相关的资料较少,很多都是参考官方例子的代码。我们这篇文章就给出一些基于计算机视觉的代码实例。实际上GIL 限制了线程池的使用场景,但是从发展的眼光看,使用线程池是非常必要的。尤其是正儿八经的生产系统。可以使用3种方法避免全局锁的限制: 多进程,cython,使用非CPython解释器。

shiter编写程序的艺术 444

〖Python语法进阶篇⑦〗- 线程池与GIL全局锁

上一章节我们学习了线程的创建和常用方法,发现它的创建和使用与进程的创建、使用几乎是一样的,只是模块的使用有所区别而已。今天来学习一下线程池的创建与全局锁。线程池的创建于进程池的原理是相同的;关于GIL全局锁,暂时没有代码上的练习,而是对其概念进行一个简单的启蒙。接下来让我们进入正题,开始今天的学习。

易编橙 · 终身成长社群,相遇已是上上签! 4万+

Python中的进程池与线程池

进程池和线程池在 Python 中均有其独特的应用场景,根据任务的具体需求选择适当的池类型十分重要。CPU密集型任务更适合使用进程池,而I/O密集型任务则更适合线程池的方式。在 Windows 操作系统中,优先选择线程池处理任务以确保程序的执行效率和稳定性。在需要多任务并行且又需共享数据的应用场景中,线程池提供了一种有效的解决方案,虽然保护数据的同步开销不可忽视。通过适当的实现和异常处理机制,您可以构建更高效、更稳定的并发应用程序,从而充分发挥多核处理器的潜力和网络通信能力。

python探索 1199

python-21-线程池和进程池python并发编程

python并发编程线程池和进程池

qq_20466211的博客 3366

Python中的多线程与多进程编程:线程池与进程池的应用

线程池是一种预先创建一定数量的线程并维护这些线程,以便在需要时重复使用它们的技术。线程池可以减少线程创建和销毁的开销,提高线程的重复利用率。在Python中,可以使用来创建线程池。本文介绍了在Python中使用线程池和进程池来实现并发编程的方法,并提供了相应的代码示例。首先,我们讨论了多线程和多进程的概念及其在并发编程中的应用场景。然后,我们深入探讨了线程池和进程池的工作原理以及它们之间的性能比较。在代码示例部分,我们演示了如何使用线程池和进程池来执行多个任务,其中包括下载多个文件的示例。

一键难忘的博客 3372

告别死记硬背!用实际案例带你玩转UE5编辑器界面(附场景搭建练习)

本文通过实际案例教学,带你轻松掌握Unreal Engine5编辑器界面的核心功能。从创建基础场景到添加光源和可交互对象,逐步讲解内容浏览器、模式面板、世界大纲等模块的协同工作方式,告别死记硬背的学习模式。附场景搭建练习,助你快速上手UE5开发。

weixin_30566063的博客 729

python-pptx库中文文档及使用样例

个人使用样例及部分翻译自官方文档,并详细介绍chart的使用

4万+

Python中的线程池与进程池:并行编程的高效选择

在Python编程中,实现并行处理任务是提高程序性能的关键。线程池和进程池是Python中常用的并行编程工具,它们能够有效地利用多核处理器的优势,加速程序的执行。本文将介绍线程池和进程池的基本概念,并通过代码示例和解析说明它们的使用方式和优劣势。

一键难忘的博客 3898

yanshee 机器人全流程指南

2.点击yanshee app右上角根据提示操作 3.当手机显示成功连接 ,按下机器人胸前按钮说出“ip地址”4.根据机器人播报的ip地址加上:8888使用浏览器访问,你就会看到 jupyterd的界面,里面可以新建文件也可以改他存在的文件。我们使了yanshee机器人,这个是面向K12、中高职、高校学生推出的开源人形机器人教育平台,应用于课程教学、竞赛、科研活动等场景。我们接下来可以根据这些apl做许多好玩的,比如控制他运动,跳舞唱歌,it`s easy。注意电脑,手机,机器人必须连同一个网。

qq_44827929的博客 7613

python进程池和线程池_python自带的进程池及线程池

进程池""" python自带的进程池 """from multiprocessing import Poolfrom time import sleepdef apply(*args, **kwargs):print(args, kwargs)sleep(3)return 'ok'if __name__ == '__main__':pool = Pool(3)result = pool.appl...

weixin_39998521的博客 299

CGAL-5.6的安装与编译(Win10+vs2022+CGAL-5.6+Boost1.82.0)

CGAL是Computational Geometry Algorithms Library(计算几何算法库)的缩写,C++的高效算法库。CGAL只是一个头文件库(从5.0版本开始),这意味着CGAL无需编译,只需安装好CGAL的依赖项即可。CGAL5.6。

baidu_34931359的博客 3902

Dify学习笔记-知识库(六)

Dify学习笔记-知识库

大数据知识梳理 2万+

python进程池和线程池_python之线程池和进程池

线程池和进程池一、池的概念池是用来保证计算机硬件安全的情况下最大限度的利用计算机它降低了程序的运行效率但是保证了计算机硬件的安全从而让你写的程序能够正常运行'''无论是开设进程也好还是开设线程也好 是不是都需要消耗资源只不过开设线程的消耗比开设进程的稍微小一点而已我们是不可能做到无限制的开设进程和线程的 因为计算机硬件的资源更不上!!!硬件的开发速度远远赶不上软件我们的宗旨应该是在保证计算机硬件能...

weixin_39559559的博客 171

【Godot】构建可维护的游戏工程 —— 项目代码组织结构

本文系统梳理了Godot引擎项目组织原则与架构模式,提出场景中心化、命名规范一致性和资源隔离三大核心原则。推荐按功能模块划分目录结构(如scenes/、entities/、systems/),采用snake_case命名避免跨平台问题,并通过.gdignore优化资源管理。文章详细解析了自包含场景设计、信号驱动解耦等架构技巧,以及团队协作中的版本控制策略,强调通过模块化设计平衡一致性与实用性。最终目标构建清晰可维护的项目结构,使资源定位和功能扩展更加高效。(148字)

qq_40205510的博客 1175

Python 进程池(ProcessPoolExecutor)全面使用教程

Python进程池(ProcessPoolExecutor)是处理CPU密集型任务的高效工具。它通过预创建进程池简化多进程编程,提供submit()/map()提交任务、future.result()获取结果等核心方法。文章详细介绍了进程池的基本使用、高级功能(回调处理、异常捕获)、性能优化技巧(合理设置worker数、数据共享优化),以及与线程池的适用场景对比。实际应用案例展示了如何用进程池批量处理图片,并提供了常见问题解决方案。进程池特别适合需要并行计算且任务独立的场景,能有效利用多核CPU提升性能。

YAnt的博客 3487

STM32 HAL SDADC DMA

由于项目需要使用STM32F373单片机的SDADC功能对电位计进行检测,网上资料比较少,踩了很多坑,下面进行总结。

weixin_44597885的博客 1196

36 Agent Memory:如何让智能体记住该记的东西

Agent 会调用工具,只能说明它有了行动能力。要让它跨会话、跨任务持续工作,还需要一套可治理的 Memory 系统。本文讲清上下文窗口、RAG 和 Agent Memory 的区别,以及工作记忆、情景记忆、语义记忆、程序记忆该如何分层设计。

老于的笔记的专栏 89
上一篇: python入门开发学习笔记之掌握线程queue的三种用法
下一篇: python入门学习笔记之掌握什么是协程
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值