进程
启动多个进程,进程之间通过操作系统调用,操作系统又有一个时间片的概念,这样多CPU的话就可以调用多个进程。
线程
启动多个线程,真正被CPU执行的最小单位是线程,在Cpython中由于GIL锁的概念,同一时刻只能有一个线程工作。再其它语言中允许用一时间调用多个线程执行。不会影响高IO的操作。
弊端:开启一个线程,创建一个线程 需要创建寄存器,堆栈。
协程
本质就是一个线程,在多个任务之间来回调用,不需要创建寄存器,堆栈。
![]()
进程:
进程是一个正在运行的程序,程序不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序称之为进程。
进程的提出是在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行,大大提高了CPU的利用率。进程就是为了在CPU上实现多道编程而提出的。
但是进程也有很多缺点例如:
- 进程只能在同一时间干一件事,如果同时干两件事或多件事,进程就无能为力了。
- 进程在执行的过程中如果出现阻塞,例如等待输入,整个进程会被挂起。
- 进程开销大,创建,撤销与切换存在较大的时空开销。
后来出现了线程,线程是CPU调度的最小单位,每个进程中至少有一个线程。
线程比进程的优势:
- 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程共享。
- 通信: 进程间通信IPC,线程间可以直接读写进程的资源。
- 调度和切换:线程上下文切换要比进程上下文切换要快得多。
全局解释器锁GIL
- 由于CPython解释器锁的原因,同一时刻只能有一个线程运行,所以Python在CPython解释器中的多线程形同虚设。
递归锁和互斥锁
递归锁(RLock)是为了解决死锁问题,且在线程中,递归锁可以被acquire多次。
互斥锁(Lock)
信号量 KTV同一时刻只能有几个人进入到这个房间 同一时间只能有N个线程处理
事件
View Code