python 进程、线程、协程之间的区别
1. 概念(绕口)
进程:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进程资源分配和调度的一个独立单位。每个进程都有自己的独立空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立内存,所以上下文进程间的切换开销(队列,栈,寄存器‘虚拟内存,文件句柄等)比较大,但相对比较稳定安全。
线程:
线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本不拥有系统资源,只拥有一点运行中必不可少的资源(如程序计数器等),但是它于同属于一个进程的其他线程共享这个线程的所有资源。线程间通信主要通过共享内存,上下文切换很快,资源开销少,但是相比进程不够稳定容易丢失数据。
协程:
协程是一种用户态的轻量级线程。协程的调度完全由用户自己控制,协程拥有自己的寄存器、上下文和栈,协程调度切换时,将寄存器、上下文和栈保存到其他地方,再切换回来的时候恢复先前保存的寄存器、上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文切换非常快。
2. 概念(简单)
进程是资源分配的基本单位,线程是CPU调度的基本单位,协程是单线程内执行多任务
切换效率 协程 > 线程 > 进程
最高效率方式 进程 + 协程 (不考虑资源开销)
3. 选择原则
多进程:
密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。
缺陷:多个进程之间通信成本高,切换开销大。
多线程:
密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
缺陷:同一时间片只能运行一个线程(GIL锁导致的),不能做到高并行,但可以做到高并发
协程:
当程序中存在大量不需要CPU的操作时(I/O),适用于协程。
多线程请求返回是无序的,哪个线程有效处理返回就处理哪个线程,协程返回的数据是有序的。
缺陷:单线程执行,处理密集CPU和本地磁盘I/O的时候,性能较低。处理网络I/O性能比较高。
来自黑马程序员一非常有激情的老师的网络课程,感谢这位老师,讲的很细致。