什么函数在NodeJs和JS中放入EventLoop

我一直在阅读一些NodeJs的文章,以了解它的asynchronous性质,在这期间我发现了这个,并且非常喜欢Node.js,Doctor's Offices和Fast Food Restaurants – 了解事件驱动的编程

有一个叫做EventLoop的东西是基于FIFO的队列。 他们说,当一个asynchronous函数被击中时,它会被放到EventLoop并继续在那里执行。

我在这里有点困惑。 例如这里说:

实际上,像setTimeout和setInterval这样的asynchronous函数被推送到一个称为Event Loop的队列中。

并在同一篇文章中:

事件循环是一个callback函数的队列。 当asynchronous函数执行时,callback函数被推入队列中。 JavaScript引擎不会开始处理事件循环,直到执行asynchronous函数之后的代码。

但它不同于这个图像:

在这里输入图像描述

我们来看下面的例子:

 console.log("Hello,"); setTimeout(function(){console.log("World");},0); 

所以从我从这些不同的解释中得知,

  1. 第一个说function(){console.log("World");} setTimeout()函数的一部分,也就是callback,将放在EventLoop中。 一旦setTimeout完成,它也将执行EventLoop
  2. 另一个说,整个事情setTimeout(function(){console.log("World");},0); 将被放入EventLoop并将被执行…

我现在更困惑了。 这应该是简单的,但我想一个好的,但简单的解释对我来说是很好的下列问题:

  1. 上述哪一项是真实的?
  2. 什么是EventLoop? 比喻,方法,对象等真实的东西?
  3. 如果我想从零开始实现一个类似于EventLoop的事情,它会如何简单? 也许有些代码会很好看。

       

网上收集的解决方案 "什么函数在NodeJs和JS中放入EventLoop"

我将根据MDN有关事件循环的一些信息来尝试回答。 请注意,这个答案是严格的JavaScript,不是专门为节点。

从它的声音来看,令人困惑的是你的第二句话应该写得更清楚,比如:

事件循环是一个callback函数的队列。 当asynchronous函数执行时,callback函数被推入队列中。 JavaScript引擎不会开始 继续处理事件循环,直到执行asynchronous函数之后的代码。

如果是这样的话,那就更加一致了。 所有的callback,当它们被触发时,被input到一个FIFO队列中,然后依次运行。 也就是说,如果一个事件正在发射,下一个事件将不会开始,直到第一个事件完成。

我链接到上面的MDN参考甚至包括事件循环的伪代码:

 while(queue.waitForMessage()){ queue.processNextMessage(); } 

定时器和时间间隔在HTML规范中定义为DOM的一部分。 在我对该规范的快速检查中找不到任何直接引用“消息循环”的消息。

只要将Node的事件循环看作在客户端循环的“主要函数”(除了Node在服务器端,并且在技术上你不需要代码中的事件循环,因为它是基于事件的:)。

考虑一下每个连接成JS对象的客户端,这个对象通过你的代码再次运行,在它自己的地址空间里,有自己的variables,但是你程序的其他部分完全一样, ,但一般来说就是这样的)。

工作者线程是阻止I / O被分割成几部分的工具,通过插件,甚至可以将工作线程分散到不同的节点服务器中(文件I / O,数据库I / O,networking访问等等,都可以放到工作线程中) 。

节点如何工作

当你所做的事件被放入一个队列中,当它被执行的时候,它会在主事件循环(types)中运行,但更重要的是,事件本身被放置在事件循环(将调用它的触发器)中。

这是V8引擎的所有部分(即事件循环)。 是什么让节点如此伟大是它让成千上万的客户端进入同一个循环,隔离阻塞的I / O。

主要的解决方法是:Node总是在做一些事情,如果总是需要做。

与其他框架一样,I / O阻止其他代码的执行。

阻塞与非阻塞I / O

基本上,几乎所有你通常写的东西都会在事件循环中发生,但不完全是这样。 什么是发生的是你的代码运行一次,然后它只是插入事件,并退出。

那有意义吗?

所以,当你的代码完成运行时,你排队的任何事件(包括更多的代码)仍然驻留在事件循环中。

Node和其他所有的东西都不一样,但是这是一个很好的解释。

如果您有兴趣,我会在Quora上写更多的细节… https://www.quora.com/How-good-is-Node-js

第二种解释是假的 – JavaScript中没有任何机制可以将事件循环中的“全部”东西自动化。 你的第一个理解是正确的,你可以将事件队列描绘成一个callback数组。 事件循环的“迭代”执行队列中的下一个callback并将其删除。 callback被允许排队更多的callback,等等。

事件循环还检查外部事件,如networking活动,用户活动或基于计时器的事件,并为这些操作分派适当的callback。 出于这个原因,事件循环从不退出,除非应用程序closures。 如果目前没有什么可做的事情,它只是等待一些事情发生。

基于LIBUV和LIBIO的NodeJS事件循环,请参阅此链接https://github.com/joyent/libuv

我也不清楚这一点,我知道一点点,

事件循环:

步骤1:我向Nodejs发送一个请求表示从数据库读取文件; 但数据库已经在使用(所以把这个请求放入事件循环)

第二步:这个时候nodejs接收其他的请求意味着套接字请求注意:数据库操作只是现在忙,不是套接字所以它的执行套接字操作

步骤3:接收多个请求并放置到事件循环,然后根据I / O执行

I / O:例如:

  someoFileperation(callback) { //callback message i am finished any other related process in event loop } Next process: someSocketOperation(calback) { //Callback message i am finished my socket operation any other related process in Event loop }