2017-08-08 60 views
28

我读过thisthis,看着this ...Node.js的事件循环理解(有图)

我做的我是如何理解的图示:

enter image description here

  • Javascript回调(函数)可以存在于current queue,check queue,close callbacks queue,timers queueI/O callbacks queue中。
  • Js代码一次只能从current queue一个函数(任务/作业)执行。
  • 此时执行的Js代码可以将微任务(作业)添加到current queue以在其自身和宏任务(任务)之后执行到check queue。它只能通过要求API来完成,才能将任务添加到其他队列中。
  • Idle, prepare阶段用于某些内部节点js业务(也许像垃圾回收)。
  • Poll阶段轮询线程池中的线程并使用适当的回调来填充队列。
  • Idle, preparepoll阶段没有与它们关联的js回调队列。
  • (四)thread pool中的主题都是完全相同的,没有专业化。
  • 事件循环从每个队列中逐个取出并执行任务,直到它为空,然后移至下一个队列。
  • 队列中的任务没有任何与其关联的作业(微服务)。作业仅在执行任务或其他作业期间创建,并且仅存在于current task queue中。

这是理解权还是我错过了什么?

MS Power Point .pptx文件中的图可以找到here

+0

这看起来过于复杂的我。也许是这样,但是在编写代码时不是一个简单的模型吗?我认为没有必要了解所有细节。仅仅知道当前滴答的队列,下一个滴答的队列和等待定时器或I/O的回调是不够的。 –

+8

我不能回答这个问题,但我真的很感谢你把你的问题的努力。 – georg

+0

@LorenzMeyer一个简单的模型就足以写代码,但我仍想知道的引擎盖下是什么。乔治,谢谢:) – grabantot

回答

1

该图看起来相当复杂。在这种情况下,我发现一个国王比喻非常完美,对事件循环的工作原理有一个灰色层次的理解。

想象一下,你想运行的代码是一个国王,节点是仆人的军队 仆人。

这一天,一个仆人醒来,问他国王是否需要任何东西 。国王给仆人一份任务清单,并让 重新睡一会儿。仆人现在在他的同事中分发这些任务 ,他们开始工作。

一旦仆人完成一项任务,他排队在国王队区外 报到。国王一次允许一名仆人,并倾听他报告的事情。有时国王会在出路时给仆人更多的任务 。

生活是美好的,因为国王的仆人在 并行执行他的所有任务,但一次只报告一个结果,所以国王可以 重点。

这里的国王是主要的节点处理。这就是nodejs被称为单线程但异步的方式。