轮询

nodejs 异步编程 vs promise用法

六月ゝ 毕业季﹏ 提交于 2020-04-07 05:57:42
零、关于异步 如图,是一个传统nodejs项目中比较容易看到的一种编程风格,其原因是因为nodejs底层的很多异步方法都是通过配合回调方法来实现的。理解异步我们必须掌握以下几个知识点: 1、单线程 JavaScript的引擎是单线程的,即无论是在浏览器环境还是基于JavaScript引擎的nodejs服务器环境有且仅有一段代码正被执行,JavaScript引擎不会同时执行a函数的代码和b函数的代码。 2、JavaScript轮询机制(主线程 VS Event Loop线程) 轮询(event loop)简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。 就是说执行我们程序员写的代码的是主线程,当主线程遇到io操作的时候, 主线程就 通知 Event Loop线程去执行相应的I/O程序,自己则继续执行其他代码,当Event Loop线程把io任务完成后会主动告诉主线程我已经执行完了,主线程收到通知后会调用事先准备好的回调函数,完成整个任务。 基于以上原因早期的nodejs 代码会存在大量的callback函数嵌套,这些callback正是为主线程在收到Event Loop线程完成io操作后准备的回调函数。 3、如何与Event

Netty的Timer管理–开源的魅力

隐身守侯 提交于 2019-11-28 12:23:35
这里的Timer,是指定时器,现代操作系统,定时器无处不在,以至于有些将linux kernel的书,都需要单独列出一章,来将linux是如何管理这些定时器的。管理定时器其实主要的步骤有以下3步: 1.生成定时器(这里面最终要的是给予定时器其到期时间以及到期后要产生的动作) 2.将定时器放入一个数据结构中,以便系统能够定时的扫描检查这些定时器是否到期,是否需要触发 3.定期检查定时器是否到期 一般能够想到的最直观的实现定时器的办法,就是在定时器里插入一个绝对时间,然后将定时器放入一个链表,每次轮询时,将该链表整体轮询一遍,从而检查有哪些定时器到期了。那么这样的时间复杂度为:插入定时器 o(1); 每次轮询o(n). 现在的linux内核中,对timer的管理其实是根据timer离当前时间的远近,将其存放到不同的双向队列数组中,每个队列数组长度一样,比如都是2的8次方;(具体是2的几次方,这个还要依赖其他条件,这里只是举个例子)间隔时间小于2的8次方的,存放在第一个双向队列数组里;间隔时间大于等于2的8次方但小于2的16次方的,则存放在第二个双向队列数组里,以此类推; 然后每个2的8次方个周期,对上面的双向队列数组进行重新安排,比如这个时候,需要将第二个数组里的有些队列移动到地一个数组里。这样在实现时,插入定时器o(1),其只需要计算该timer的时间和当前时间的关系