重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
NIO(非阻塞IO)是一种IO编程模型,Golang中的IO底层实现方式和java NIO模型一致,通俗点说就是都采用了EPOLL。 你在使用golang读文件的时候,goroutine 会默默的挂起,只是你不知道,当读完毕了,goroutine 再次恢复,但你不用担心,goroutine 的挂起和恢复没有java线程那样可怕,你可以认为goroutine 的挂起和恢复就是保存和恢复几个变量的值,其实也是这样的。
创新互联公司专注于诸城网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供诸城营销型网站建设,诸城网站制作、诸城网页设计、诸城网站官网定制、微信小程序定制开发服务,打造诸城网络公司原创品牌,更为您提供诸城网站排名全网营销落地服务。
剩下的就是goroutine 和 java线程的区别了,goroutine是用户态的线程切换,java采用的是系统线程切换,用汇编语言描述是一个(java)调用int 80软中断,一个没有。 意味着goroutine更轻量级,可以同时相应成千上万的线程切换,java你创造上千个线程就有些吃力了。
因为java线程不能创造过多的线程,如果同时处理上万上千的请求时候,就要考虑在几十个线程来处理上万上千的请求,这就出现了很多请求和线程不可能一一对应,所以通常做法是每个线程分别处理单个请求各个阶段。好比流水线,请求是要加工的商品,每个线程处理一道工序,这样做的好处是每人都做自己熟悉的,对于程序来说每个线程执行的代码永远都是自己很短的一块,这样根据局部优化原理,更具备CPU,内存亲和力,利于JIT。说这样多,就是说如果线程和请求不能一一对应,流水线式的并发编程很麻烦,阅读性也很差,通常是线程A里面一段逻辑代码,线程B又有另一处处理的逻辑代码。
由于goroutine 的轻便,你可以将请求和goroutine 一一对应起来,不用考虑将请求在线程之间换来换去,只关心你的业务逻辑,这就是goroutine 的好处。
总结:
golang的goroutine让你比java更容易编写并发程序,但性能不会有差别(目前来说,golang性能还不能和java比,看过代码就知道了,GC弱到爆),代码不会减少,该写的逻辑还得写。ps,其实golang的(sched)go程切换代码虽然原理和java的fork-join框架一样,但是fork-join比golang的sched代码牛逼不少,开始膜拜Doug Lea吧,golang还有很长的路要走。
想当于, 位预算
public static final int OP_READ = 1 0;
public static final int OP_WRITE = 1 2;
public static final int OP_CONNECT = 1 3;
public static final int OP_ACCEPT = 1 4;
| 就是 update 一个 read 的事件
~ 就是 取消 一个 read 事件
如果你将selector理解成一个不断循环的线程你就比较容易理解事件了,假设服务器的selector就是不断循环去判断每个链接到这里的Channel的状态发生了如何的变化。一旦Channel有了状态的变化,selector就发出相应的事件