Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js非阻塞函数返回后的回调处理_Javascript_Node.js_Asynchronous_Nonblocking - Fatal编程技术网

Javascript Node.js非阻塞函数返回后的回调处理

Javascript Node.js非阻塞函数返回后的回调处理,javascript,node.js,asynchronous,nonblocking,Javascript,Node.js,Asynchronous,Nonblocking,我正在读一本Node.js的书,试图弄清楚Node.js是如何处理事件、异步函数及其回调、非阻塞I/O等的。下面是我如何理解事件循环基础知识的简要概述,然后是一些我在书中找不到明确答案的问题。如果我的基本理解有什么错误,请纠正我。然后问题就来了 据我所知,Node.js在单个线程上运行所有功能。这包括事件循环。换句话说,当事件发生时,例如HTTP请求,该请求进入事件队列。事件循环本身一次从队列中提取一个事件,并对其进行整体处理。这可能意味着立即返回一个简单的结果,或者在向第三方(如数据库或文件系

我正在读一本Node.js的书,试图弄清楚Node.js是如何处理事件、异步函数及其回调、非阻塞I/O等的。下面是我如何理解事件循环基础知识的简要概述,然后是一些我在书中找不到明确答案的问题。如果我的基本理解有什么错误,请纠正我。然后问题就来了

据我所知,Node.js在单个线程上运行所有功能。这包括事件循环。换句话说,当事件发生时,例如HTTP请求,该请求进入事件队列。事件循环本身一次从队列中提取一个事件,并对其进行整体处理。这可能意味着立即返回一个简单的结果,或者在向第三方(如数据库或文件系统)进行I/O的情况下,进行一个非阻塞的异步调用,并使用回调来告诉系统在异步函数完成时要做什么。同时,队列中的所有其他事件正在等待。如果开发人员编写的方法不异步卸载工作或不向工作人员卸载工作,则在处理任务时整个服务器将挂起

如果有任何错误,请澄清,因为这可能会影响我对以下问题答案的理解,我希望这些问题不要太愚蠢

  • 文件系统、数据库和其他此类调用不会阻塞,因为Node.js会将它们卸载到异步调用中,但如果Node.js是单线程的,那么谁在侦听新事件并管理事件循环呢?当Node.js处理某些事件时,谁在监听和管理新传入事件的队列,以便在Node.js的注意力转移到别处时不会丢失这些事件?我是否从根本上误解了这一点?除了运行我们代码的引擎部分之外,是否还有一个守护进程在运行或其他什么东西来管理事件队列
  • 异步函数回调的类似问题。。。当Node.js已经在处理某个回调或事件时,谁在监听和管理传入回调,以便回调不会因为在处理过程中到达而丢失
  • 当异步函数完成时,回调是否会中断事件循环并立即进行控制,或者异步函数的返回是否会在队列末尾作为新事件重新进入事件循环并再次等待轮到它自己?换句话说,来自异步函数的回调是否与任何其他事件一样处理,或者以不同的方式处理?如果它被区别对待,如何处理?这是一个根本愚蠢的问题吗
  • 回调是否会被阻塞,就像写得不好的事件处理程序(例如HTTP请求处理程序)一样?换句话说,回调中包含的写得不好的代码会阻止服务器吗?(我想答案是肯定的,但我想知道我是否正确。)
  • 这里有一个类似的问题,有很好的答案,但略有不同。这个链接的问题解决了关于用户代码的异步性问题,但其中一个答案似乎包含了对我的问题的附带回答。我感兴趣的是用户从不与之交互的节点的内部工作,例如,在节点阻塞时谁管理新的客户端请求插入到事件队列中,回调也是如此,等等。

    回忆起各种来源,我阅读了一段时间

    Node.js并不完全是单线程的。它将磁盘、数据库、HTTP API调用卸载到其他线程,这些线程一旦完成,就会将其回调排入事件循环队列

  • 还涉及其他线程
  • 事件循环应该是一个类似队列的数据结构,由多个线程访问
  • 大多数情况下会重新进入事件循环(在队列末尾)。但也有办法把它摆在前面。(需要检查)
  • 对。例如,如果使用fs.readFileSync,它将阻塞服务器一段时间
  • 事件循环:


    我是凭记忆写的。如果这对您有帮助,我可以尝试查找参考资料。

    首先,从以下内容开始:

    短语“Node.js是单线程的”有点误导人,在技术上是不正确的。对于代码中的所有意图和目的,代码都是单线程的,但节点本身不是。在节点中有一些API和操作(通常是异步I/O完成的),它们将在内核或LibUV的线程池中使用不同的线程

    现在按每个问题的顺序将其分解:

  • 文件系统、数据库和其他此类调用不会阻塞,因为Node.js会将它们卸载到异步调用中,但如果Node.js是单线程的,那么谁在侦听新事件并管理事件循环呢?当Node.js处理某些事件时,谁在监听和管理新传入事件的队列,以便在Node.js的注意力转移到别处时不会丢失这些事件?我是否从根本上误解了这一点?除了运行我们代码的引擎部分之外,是否还有一个守护进程在运行或其他什么东西来管理事件队列
  • 当节点处理某个事件时,没有人在侦听队列。他们不会迷路,因为这是一个队列。它将等待节点完成它正在做的事情,这样它就可以返回到队列,检查它是否有下一件事情要做。这是节点“事件循环”的一部分,也是为什么阻塞代码(不允许节点返回到事件循环顶部或需要很长时间的代码)有问题的原因

    异步I/O操作位于单独的线程中,当节点执行其他操作时,可以将内容存放在队列中。当节点完成该操作时,它可以处理队列中的事情

  • 异步函数回调的类似问题。。。当Node.js已经在处理某个回调或事件时,谁在监听和管理传入回调,以便回调不会因为在处理过程中到达而丢失
  • 再说一次,它没有丢失
    function add(a, b, cb) { cb(a + b) }
    
    async.whilst(
      function() { return true },
      function(cb) { add(1 + 1, cb) },
      function() { console.log('Done!') }
    )