线程、进程、协程的区别

定义

  • 进程:是具有一定独立功能关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单元。
  • 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程跟小的能独立运行的基本单位。
  • 协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制。

区别

  1. 每个进程都有自己的独立内存空间,不同进程通过进程间通信进行通信。
  2. 线程基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但它与同属一个进程的其他线程共享进程所有的全部资源。(一个标准的线程由线程ID、当前指令指针(PC),寄存器集合和堆栈组成。)
  3. 进程和线程的切换由操作系统控制,协程的切换由自己控制,从当前协程切换到其他协程是由当前协程控制。协程拥有自己的寄存器上下文和栈。

GIL锁

在CPython中,全局解释器锁(GIL)是一个互斥锁,用来阻止多个本地线程同时执行Python字节码。
这把锁是必要的,因为CPython的内存管理不是线程安全的。为了支持多线程机制,就需要实现不同线程对共享资源访问的互斥。
缺点:多处理器退化为单处理器
优点:避免了大量加锁解锁的操作
影响:无论有多少个线程,多少个CPU,Python执行一个进程时同一时刻只允许一个线程被CPU调度。
所以,Python无法利用多核CPU实现多线程。

补充

使用CPU的操作,多线程执行,无意义。
计算密集型,应使用多进程。
IO操作不频繁使用CPU,可以用多线程;多进程浪费资源。

IO密集型,多线程。
计算密集型,多进程。

协程+异步非阻塞

协程,只是人为控制一个线程,进行操作。单纯的协程没有意义。
协程+异步非阻塞,可以完成IO并发操作(用一个线程完成)。

异步非阻塞模块
  • 非阻塞:不等待
  • 异步:回调,执行某个任务完成之后,自动执行某个函数(回调函数)。

gevent模块:基于协程的异步非阻塞模块。
Twisted:基于事件驱动异步非阻塞模块(框架)。