进程,线程,协程 的对比
进程
进程是具有一定独立功能的程序关于某个数据集合上的一次运动活动,进程是系统进行资源分配和调度的独立单位,每个进程都有自己的独立内存空间,进程通过队列来通信,由于进程占据独立的内存,相对比较稳定安全。
线程
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源,线程之间切换快,资源要求少,但相比进程不够稳定容易丢失数据。
协程
协程是一种微线程,调度完全由用户控制,拥有自己的寄存空间,在切换的时候可以恢复寄存在空间里的数据在此基础上进行运行,所以上下文切换的非常快。多线程请求返回是无序的,那个线程有数据返回就处理那个线程,而协程返回的数据是有序的。
进程,线程,协程的关系
我们就拿PyCharm中的一个py文件来说,当py文件运行起来,在进程中就会有主进程,主进程会创建子进程,由于进程可以调度各种资源来和线程共享,那么在主进程中就包涵有线程,当线程运行起来就会有主线程,主线程也可以创建很多子线程,我们知道协程是个微线程依赖主线程运行,协程就相当于一个单线程,下面我们就用图里看一下
多进程,多线程,协程的应用场景
多进程:适合完成密集的CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,缺点是多个进程之间通过队列通信,切换消耗大。
多线程:适合用于密集I/O任务(网络I/O,磁盘I/O,数据库I/O)等,缺点是同时执行时通过轮询的方式,每次只运行一个线程,不能做到高并行,只能做到高并发。
协程:适合用于程序中存在大量不需要CPU的操作时(I/O),缺点是通过单线程执行,处理本地I/O及磁盘I/O性能较低,处理网络I/O性能较高