基于python的进程、线程、协程理解
为什么要引入并发编程?
场景1:一个网络爬虫,按顺序爬取花了1小时,采用并发下载可以减少到20分钟。
场景2:一个app应用,优化前每次打开页面需要3秒,采用异步并发提升到每次200毫秒。
引入并发,就是为了提升程序运行速度。
- 单线程串行 - 单线程异步IO- 多线程并发 - 多CPU并行 - 多机器并行
- normal - asynio - threading - multiprocessing - hadoop/hive/spark
Python对并发编程的支持
-
多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成。(待定) 暂定就是并行
修订:线程概念和进程概念类似,只是在资源共享上的概念有所不同。 可以理解为线程的资源大小是变化的,而进程的资源大小是固定的,线程越多,每一个线程
资源越少,在没有利用到cpu和io可以同时执行且资源不变的情况下达到提高想要的“效率”的目的。 -
多进程:multiprocessing,利用多核CPU的能力,并行执行任务。(其中每个CPU也有可能会设计成多线程) 暂定就是并行
-
异步IO:asynio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行 暂定就是并发
修订:利用CPU和IO同时执行的原理,暂时把IO执行当作等待,(协程其实是CPU资源?IO概念不清楚,内存和硬盘的交互,和CPU无关?)那么我们就可以执行
计算,然后切换再执行计算,不用被阻塞需要等IO结束才能执行下一步操作。 -
使用Lock对资源加锁,防止冲突访问。这在异步当中很常见,因为函数执行的顺序不再是顺序的,他可能先执行后面的内容,再执行前面的内容,
可能会读取一个没有来得及修改的值,比如余额,造成逻辑错误。(类比条件竞争)和sql中的事物是一样的概念。 -
使用Queue实现不同线程/进程之间的数据通信。
-
可以使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待提取、获取结果。
-
使用subprocess启动外部程序的进程,并进行输入输出交互。
cpu和io
可以并发运行的条件:
1.有其他资源充盈
2.有阻塞情况发生
怎么样选择多线程多进程多协程
Python并发编程有3种模式:
多线程Thread、多进程Process、多协程Coroutine
- 什么是CPU密集型计算、IO密集型计算?
- 多线程、多进程、多协程的对比
CPU-bound
I/O在很短的事件就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。
例如:压缩解压缩、加密解密、正则表达式搜索
I/O-bound
IO密集型指的是系统运行大部分的状况是CPU在等I/O(硬盘/内存)的读/写操作,CPU占用率仍然较低。
例如:文件处理程序、网络爬虫程序(网络下载、上传)、读写数据库程序
多进程 Process(multiprocessing) -- 一个进程中可以启动N个线程
- 优点:利用多核CPU并行运算
- 缺点:占用资源最多、可启动数目比线程少(我感觉是不是他的意思是,因为占用资源多,资源有限,所以可启动数目少?)
- 适用于:CPU密集型计算
多线程 Thread(threading) -- 一个线程中可以启动N个协程
- 优点:相比进程,更轻量级、占用资源少
- 缺点:
- 相比进程:多线程只能并发执行,不能利用多CPU(GIL)(单看多线程)(对于python多线程是真的只能使用一个cpu,而我觉得应该是对于thread库)
- 相比协程:启动数目有限制,占用内存资源,有线程切换开销。
- 适用于:IO密集型计算、同时运行的任务数目要求不多
多协程 Coroutine(asyncio)
- 优点:内存开销最少、启动协程数量最多(能够到达几万个)
- 缺点:支持的库有限制(aiohttp vs requests)、代码实现复杂
- 适用于:IO密集型计算、需要超多任务运行、但有现成协程库支持的场景 (说的其实很抽象,其实理解原理就大概知道他们的使用场景了)
并行 和 并发
计算机术语赋予他们的概念。
并行就是一起执行
并发是可以来回切换,但每一时刻只执行一样东西。
极好的文章
线程和协程的区别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!