相关疑难解决方法(0)

了解事件循环

我在想它,这就是我提出的:

假设我们有这样的代码:

console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Run Code Online (Sandbox Code Playgroud)

请求进来,JS引擎开始逐步执​​行上面的代码.前两个呼叫是同步呼叫.但是当谈到setTimeout方法时,它就变成了异步执行.但是JS立即从它返回并继续执行,这被称为Non-BlockingAsync.并继续致力于其他等

执行结果如下:

ACDB

所以基本上第二个setTimeout完成第一个,它的回调函数比第一个更早执行,这是有道理的.

我们在这里谈论单线程应用程序.JS引擎继续执行此操作,除非它完成第一个请求,否则它不会进入第二个请求.但好处是它不会等待阻塞操作,比如setTimeout解决所以它会更快,因为它接受新的传入请求.

但我的问题出现在以下几个方面:

#1:如果我们讨论的是单线程应用程序,那么setTimeouts当JS引擎接受更多请求并执行它们时,什么机制会处理?单个线程如何继续处理其他请求?什么工作,setTimeout而其他请求继续进入并执行.

#2:如果这些setTimeout函数在幕后执行,而有更多请求进入和执行,那么在幕后执行异步执行的是什么?我们谈到的这件事叫EventLoop什么?

#3:但是不应该将整个方法放入,EventLoop以便整个事件被执行并调用回调方法?这是我在谈论回调函数时所理解的:

function downloadFile(filePath, callback)
{
  blah.downloadFile(filePath);
  callback();
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,JS引擎如何知道它是否是异步函数,以便它可以将回调EventLoop? Perhaps something like the放在C#中的async`关键字中,或者某种属性指示JS引擎将采用的方法是异步方法并应相应地对待.

#4:但是一篇文章说的与我猜测事情可能如何起作用完全相反:

Event Loop是一个回调函数队列.执行异步函数时,回调函数将被推入队列.在执行异步函数之后的代码之前,JavaScript引擎不会开始处理事件循环.

#5:这里有这个图像可能会有所帮助,但图像中的第一个解释是说第4个问题中提到的完全相同:

在此输入图像描述

所以我的问题是要对上面列出的项目做一些澄清?

javascript multithreading asynchronous event-loop node.js

126
推荐指数
3
解决办法
5万
查看次数

我知道回调函数是异步运行的,但为什么呢?

语法的哪一部分提供了此函数应该在其他线程中运行并且是非阻塞的信息?

让我们考虑node.js中的简单异步I/O.

 var fs = require('fs');
 var path = process.argv[2];

  fs.readFile(path, 'utf8', function(err,data) {
   var lines = data.split('\n');
   console.log(lines.length-1);
  });
Run Code Online (Sandbox Code Playgroud)

究竟是什么让它在背景中发生?任何人都可以准确地解释它或粘贴一些好资源的链接?我看到的每个地方都有关于回调是什么的大量信息,但没有人解释为什么它实际上是这样的.

这不是关于node.js的具体问题,而是关于每种编程语言中回调的一般概念.

编辑:

可能我提供的例子并不是最好的.所以我们不要考虑这个node.js代码片段.我一般都在问 - 当遇到回调函数时,程序是如何继续执行的.什么是语法使回调概念成为非阻塞概念?

提前致谢!

javascript asynchronous callback node.js

12
推荐指数
1
解决办法
2427
查看次数

Nodejs的内部线程池如何工作?

我已经阅读了很多关于NodeJ如何工作的文章.但我仍然无法弄清楚Nodej的内部线程是如何进行IO操作的.

在这个答案/sf/answers/1424258181/中,他说NodeJ的线程池中有4个内部线程来处理I/O操作.那么,如果我同时有1000个请求,每个请求都想进行I/O操作,例如从数据库中检索大量数据.NodeJs将分别​​将这些请求传递给这4个工作线程,而不会阻塞主线程.因此,NodeJ可以同时处理的最大I/O操作数是4个操作.我错了吗?.

如果我是对的,剩下的请求将在哪里处理?主要的单线程是非阻塞的并且继续将请求驱动到相应的操作员,那么这些请求在所有工作线程充满任务的情况下会在哪里进行?.

在下图中,所有内部工作线程都充满了任务,假设它们都需要从数据库中检索大量数据,并且主要单线程继续向这些工作者发送新请求,这些请求将在何处进行?是否有内部任务queuse来存储这些请求?

在此输入图像描述

javascript multithreading event-loop node.js

11
推荐指数
1
解决办法
6070
查看次数

有没有其他方法可以在没有无限 while 循环的情况下实现“监听”功能?

我一直在思考像 React 这样的代码和库,它们可以自动对发生的事件做出反应,并且想知道所有这些是如何在 C++ 和机器代码的较低级别实现的。

我似乎无法想出任何其他方式可以使用 if not with while loop 在另一个线程上运行来实现诸如事件侦听器之类的东西。

那么这一切都在幕后吗?只是 while 一直循环下去?例如,RethinkDB 将自己宣传为具有repubsub库的“实时数据库” 。“订阅”方法是否只是在后台使用 while 循环实现的?我似乎无法找到任何相关信息。

像,插座之类的,也是。当计算机在端口上“侦听”套接字连接时,该计算机是否正在运行类似以下内容:

while(1) {
    if (connectionFound) {
        return True;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者有什么我想念的吗?

javascript events loops rethinkdb reactjs

3
推荐指数
1
解决办法
274
查看次数