java - java背景下在node中的思考

标签 java javascript node.js asynchronous

<分区>

我是一名 Java 开发人员,一切都以顺序方式(或与多个线程并发)一个接一个地工作。按顺序放置事物是合乎逻辑的。 但是 Node 以并发顺序与单线程一起工作。即使它仅在单线程上工作,它又有什么好处?

老实说,我对node单线程的概念没有理解。只有一个线程处理所有事情?

关于如何开始使用 Node 进行思考的任何建议都会对我有所帮助。

最佳答案

同步编程(Java)

如果您熟悉 Java 或 .Net 等同步编程(编写代码做一件事接另一件事)。采取以下代码, 例如:

var fs = require('fs');
var content = fs.readFileSync('simpleserver1.js','utf-8');
console.log('File content: ');
console.log(content);

它将一个简单的网络服务器的代码写到控制台。代码按顺序工作,在下一行之后执行每一行。直到上一行执行完才执行下一行。

虽然效果很好,

what if the file in this example were really large and took minutes to read from?

How could other operations be executed while that code or long operation is running? These questions will not arise if you are working in java, because you have many threads to work for you(to serve multiple requests)


异步编程(Node.Js)

但是,当您使用 Node 时,您只有一个线程,用于处理所有请求。

所以异步编程来了,帮你在javascript(Node)上学

要在其他长操作正在运行时执行操作,我们使用函数回调。下面的代码展示了如何使用异步回调函数:

var fs = require('fs');
fs.readFile('simpleserver1.js','utf-8', function(err,data){
       if (err) {
              throw err;
       }
       console.log(“executed from the file finishes reading”);

});
//xyz operation

请注意,“executed from the file finishes reading”这一行是在读取文件时执行的,因此我们可以在执行文件的主要读取操作的同时执行其他操作

现在看代码中的//xyz操作。正在读取文件时,服务器不会等待文件完全读取。它会开始执行//xyz operation,当文件准备好时,会返回fs.readFile(中提供的回调函数。

这就是异步编程在 Node 中的工作方式。

此外,如果您想比较 Java 和 Node,您可以阅读此 Article


编辑:

node.Js单线程是怎么实现的 让我们来看一个场景,客户端请求服务器:

Assumptions:

1) there is single server process, say serverProcess,

2) There are 2 clients requesting server, say clientA and clientB.

3) Now, consider clientA, is going to require a file Operation(as one shown above using fs).

这里发生了什么,

Flow:

1) clientA requests serverProcess, server gets the request, then it starts performing file operation. Now it waits till the file is ready to read(callback is not yet invoked yet).

2) clientB requests serverProcess, Now the server is free right now, as it is not serving clientA, so it servs clientB, in the mean-time, the callback from fs.read, Notifies the server that file data is ready, and it can perform operations on it.

3) Now server starts serving 'clientA'.

现在您看到了,只有一个服务器线程处理了两个客户端请求,对吧?


现在,如果这是 JAVA 会发生什么,您会创建另一个服务器线程来为 clientB 提供服务,而 clientA 由第一个线程提供服务,并等待文件被阅读。所以这就是 Node 是单线程的,这意味着单个进程处理所有请求。


问题:

while there is another process invoked who prepared data from file system, how would you say node is single threaded:

看,I/O(files/database),本身就是一个不同的进程,这里的区别是什么,

1) Node 不会等待一切就绪(像 java),而是会开始它的下一个工作(或服务其他请求),但是无论发生什么,node 都不会创建一个不同的线程来服务其余请求(除非明确完成//但不推荐)。

2) 而 java 将自己创建另一个线程来处理新请求。

关于java - java背景下在node中的思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626093/

相关文章:

java - Scala 和 Gosu(与 Java 相关)之间的本质异同是什么?

javascript - 如何防止在 Yii2 中提交多个表单?

javascript - JQuery Daterangepicker onchange 事件

node.js - exceljs 以 csv 格式正确写入文件,但 xlsx 格式的文件已损坏

javascript - nodejs : async.系列未按顺序执行函数

java - 如何比较Java中三个数组列表的大小?

java - Jackson key 解串器未被调用/识别

java - 如何在JAVA中获取帧数(mp4)?

javascript - 将 JSON 中的值传递为 vuejs 中动态搜索链接的变量

javascript - Puppeteer - 如何在没有导航的情况下点击链接