今天被问了进程和线程是什么?
按概念回答了 “进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”。
然后追问,为什么线程是操作系统调度的最小单元?
一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
又问,进程如何并发多个线程? 卒。
单个CPU(也可以多个CPU)将多个线程中的每个线程(多个进程中的每个进程)按时间分为一个一个的时间片,每一个时刻只执行某个线程(进程)的时间片,时间片过期后转而执行下一个线程(进程)的时间片。
没完,如何实现多进程:
就记得用multiprocessing来写。卒
Python实现多进程的几种方式:
- 方式一: os.fork()
- 方式二: 使用multiprocessing模块: 创建Process的实例,传入任务执行函数作为参数
- 方式三: 使用multiprocessing模块: 派生Process的子类,重写run方法
- 方式四: 使用进程池Pool
接着协程是啥:
协程是一种用户态的轻量级线程。是一次异步操作
然后问什么是异步: 卒
为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式,不相关的程序单元之间可以是异步的。
例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。这些异步操作的完成时刻并不确定。简言之,异步意味着无序。
协程的优点: 卒
(1)无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)
(2)无需原子操作锁定及同步的开销
(3)方便切换控制流,简化编程模型
(4)高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
协程的缺点: 卒
(1)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
(2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
三者的区别: 卒
(1)进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
(2)线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
(3)协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。