关于进程、线程、协程对比的一个很好的例子:
有一个老板想要开个工厂进行生产某件商品(例如剪子)他需要花一些财力物力制作一条生产线,这个生产线上有很多的器件以及材料这些所有的为了能够生产剪子而准备的资源称之为:进程。
只有生产线是不能够进行生产的,所以老板的找个工人来进行生产,这个工人能够利用这些材料最终一步步的将剪子做出来,这个来做事情的工人称之为:线程
接着老板为了提高生产率,想到3种办法:
a.在这条生产线上多招些工人,一起来做剪子,这样效率是成倍増长,即单进程 多线程方式
b.老板发现这条生产线上的工人不是越多越好,因为一条生产线的资源以及材料毕竟有限,所以老板又花了些财力物力购置了另外一条生产线,然后再招些工人这样效率又再一步提高了,即多进程 多线程方式
c.老板发现,现在已经有了很多条生产线,并且每条生产线上已经有很多工人了(即程序是多进程的,每个进程中又有多个线程),为了再次提高效率,老板想了个损招,规定:如果某个员工在上班时临时没事或者再等待某些条件(比如等待另一个工人生产完谋道工序之后他才能再次工作,那么这个员工就利用这个时间去做其它的事情,那么也就是说:如果一个线程等待某些条件,可以充分利用这个时间去做其它事情,其实这就是:协程方式。本文地址:http://47.93.183.36/article/847.html,未经许可,不得转载.
关于协程,我最开始是在Lua开发中碰到这个词语,当时的理解很模糊。后来在GO开发中又遇到了协程概念,因为协程是GO能支撑高并发的原因。但实际这个协程我很早就接触到了,因为在了解nginx的异步机制的时候,知道nginx能实现高并发的原因之一就是通过nginx的异步机制,而这个nginx的异步机制就是在某个IO需要时间处理的时候,nginx会自动挂起当前处理去执行其它的任务,在挂起的任务成功后epoll多路复用会执行一个回调异步返回接着执行,没有上下文的开销。从而保持每一个线程都是近似100%的时间都在工作的。本文地址:http://47.93.183.36/article/847.html,未经许可,不得转载.
其它关于进程、线程、协程资料整理在此:本文地址:http://47.93.183.36/article/847.html,未经许可,不得转载.
1.线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间,进程切换需要的资源很最大,效率很低。线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)
2.资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
3.进程是资源分配的单位,线程是操作系统调度的单位。
4.进程和线程均可并发执行,每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5.一个线程可以多个协程,一个进程也可以单独拥有多个协程。
6.线程进程都是同步机制,而协程则是异步。
7.协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。协程切换任务资源很小,效率高
8.线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程。
9.协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行,线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor),执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。
10.线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发。但同一时间其实只有一个协程拥有运行权,相当于单线程的能力。本文地址:http://47.93.183.36/article/847.html,未经许可,不得转载.
本文地址:http://47.93.183.36/article/847.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
手机扫码直接打开本页面 |