定义
- 进程:是具有一定独立功能关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单元。
- 线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程跟小的能独立运行的基本单位。
- 协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
区别
- 每个进程都有自己的独立内存空间,不同进程通过进程间通信进行通信。
- 线程基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但它与同属一个进程的其他线程共享进程所有的全部资源。(一个标准的线程由线程ID、当前指令指针(PC),寄存器集合和堆栈组成。)
- 进程和线程的切换由操作系统控制,协程的切换由自己控制,从当前协程切换到其他协程是由当前协程控制。协程拥有自己的寄存器上下文和栈。
GIL锁
在CPython中,全局解释器锁(GIL)是一个互斥锁,用来阻止多个本地线程同时执行Python字节码。
这把锁是必要的,因为CPython的内存管理不是线程安全的。为了支持多线程机制,就需要实现不同线程对共享资源访问的互斥。
缺点:多处理器退化为单处理器
优点:避免了大量加锁解锁的操作
影响:无论有多少个线程,多少个CPU,Python执行一个进程时同一时刻只允许一个线程被CPU调度。
所以,Python无法利用多核CPU实现多线程。
补充
使用CPU的操作,多线程执行,无意义。
计算密集型,应使用多进程。
IO操作不频繁使用CPU,可以用多线程;多进程浪费资源。
IO密集型,多线程。
计算密集型,多进程。
协程+异步非阻塞
协程,只是人为控制一个线程,进行操作。单纯的协程没有意义。
协程+异步非阻塞,可以完成IO并发操作(用一个线程完成)。
异步非阻塞模块
- 非阻塞:不等待
- 异步:回调,执行某个任务完成之后,自动执行某个函数(回调函数)。
gevent模块:基于协程的异步非阻塞模块。
Twisted:基于事件驱动异步非阻塞模块(框架)。