Python 学习系列之线程和协程
一、重温进程&线程
对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。
- 进程是系统分配资源的最小单位
- 线程是CPU调度的最小单位
- 由于默认进程内只有一个线程,所以多核CPU处理多进程就像是一个进程一个核心
线程共享进程的代码,文件句柄等资源,变量等数据,内存地址空间。
- 线程属于进程。
- 线程共享进程的内存地址空间。
- 线程几乎不占有系统资源。
- 通信问题: 进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等。
线程有 5 种状态,其之间的转换
为什么需要协程?
线程之间是如何进行协作的呢?最经典的例子就是生产者/消费者模式:
若干个生产者线程向队列中写入数据,若干个消费者线程从队列中消费数据。
二、协程
2.1协成的定义
**协程是一种比线程更加轻量级的存在**。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。最重要的是,**协程不是被操作系统内核所管理,而完全是由程序所控制**(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
协程并不是并行,而是类似于并发。即使在多核CPU上。
Python中的异步IO模块asyncio就是基本的协程模块。主要是解决在采用多线程的情况下,运行实现IO密集型任务。
2.2 优点和缺点
优点:
- 无需线程上下文切换的开销
- 无需原子操作锁定及同步的开销
- 方便切换控制流,简化编程模型
- 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
缺点:
- 无法利用多核资源:协程的本质是个单线程,它不能同时将单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
- 进行阻塞操作会阻塞掉整个程序
们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
- 进行阻塞操作会阻塞掉整个程序