zl程序教程

您现在的位置是:首页 >  其他

当前栏目

进程线程协程素质三连

2023-03-15 22:06:17 时间

今天被问了进程和线程是什么? 按概念回答了 “进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”。

然后追问,为什么线程是操作系统调度的最小单元? 一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

又问,进程如何并发多个线程? 卒。 单个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)协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。