【问题标题】:Thinking in node if Java background [closed]如果 Java 背景在节点中思考 [关闭]
【发布时间】:2015-04-21 23:04:42
【问题描述】:

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

坦率地说,我没有得到 node.js 中单线程的概念。只有一个线程处理所有事情?

任何建议都会对我如何开始思考节点有益。

【问题讨论】:

  • ok got -1 请发表评论,以便我了解我的问题有什么问题。我谷歌并没有找到任何将 java 与节点相关的东西
  • 你可以学习浏览器javascript..你会解决你的难题
  • 好的,你能解释一下浏览器javascript是什么意思吗?
  • 我知道 javascript 但它也是按顺序运行的 那么 javascript 和 node 有什么不同呢?

标签: java javascript node.js asynchronous


【解决方案1】:

这已经说了百万次了,但让我给你一个关于 Java 的简短回答。

如果你想读取一个长文件,你可以在 Java 中创建单独的线程,而不阻塞主线程。

在 Javascript 中,您只需使用回调读取文件。

这两者的主要区别:

  1. 使用多线程(竞争条件等)更容易搞砸代码。
  2. 您并不需要 CPU 的第二个核心的能力来读取文件,这是一个慢 I/O 的问题,而不是密集的通信。
  3. 在回调中,如您所说,有单线程。不过,它只是要求底层系统读取文件,并继续执行您的代码。读取文件后,javascript 会暂停它正在执行的代码,然后返回运行您的回调。

有时,您还必须在 Javascript 中进行计算密集型工作。在这种情况下,您可以生成一个新进程 - 查看 cluster 模块。但通常情况下,计算或 I/O 繁重的操作已经为您完成,您只需通过回调来使用它们。

【讨论】:

  • 所以我有一个线程用于列表,另一个用于实际阅读或写作,那么它怎么可能是单线程的?
  • 如果每个线程都服务于自己的独立请求,那么搞砸多线程代码会更容易,这并不是真的。它实际上是基于回调的代码,这使得事情变得困难,因为工作单元被分割成点点滴滴。你失去了简单的基于堆栈的局部范围,全局错误处理变得很痛苦,由于所有回调注册/注销等原因,内存泄漏变得更有可能。
  • 业界的一个事实是,绝大多数 Java EE 专业人员实际上对并发编程一无所知,尽管他们每天都在编写将并发执行的代码。
  • 哈哈这是事实,即使我在编程期间从未尝试过太多线程(可能是弹簧本身使用内部多线程)。
  • @MarkoTopolnik 谢谢你的解释。
【解决方案2】:

好的,让您抢先一步。它与线程无关,它与每秒的任务有关。在线程模式中,线程在等待时会阻塞。

在非阻塞设计中,每次您等待某事时,您只需将线程返回并在您等待的事件发生时唤醒。这些事件被称为未来。因此,将来我想在发生这种情况时执行此操作(或在失败的情况下执行其他操作)。基本上就是这样。

它不是节点或 javascript。它也以 scala 闻名,当然还有很多其他语言。如果您是 Java 人,请寻找异步处理。码头提供它。 Vertx 以无共享架构而闻名。

所以玩得开心。我经常使用它。我有一个在自定义数据存储中存储 20GB 数据的服务器。想知道我们是如何扩展的吗?我们为服务器带来了 512GB 的空间,并且并行处理了其中的 20 个存储,但没有共享任何内容。这就像在一台机器上拥有 20 台服务器,没有明显的延迟,并且您可以使用内核进行扩展。这就是我们在当今世界开展业务的方式。

硬件很便宜,为什么要在最低级别摆弄并发?

【讨论】:

  • 是的,我使用 java 来实现它......这都是关于你的。
  • 所以 node 不是后端的 java 替代品,它只是用于 I/O 目的?
  • 不。它是用于非阻塞异步请求处理的较为突出的框架之一(意外地用 JavaScript 编写)。在 Java 世界中,我们还有其他框架。所以它也不用于 IO 目的。
  • 那么使用没有多线程和回调的java可以类似于node?​​span>
  • 一旦 Async 运动加速了 Java 获得了 Servlet 3.x 规范,它也允许多个事情并行处理。所以环顾四周。例如,检查 vertx。这是一个很好的编程模型。
【解决方案3】:

同步编程(Java)

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

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

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

虽然效果不错,

如果这个例子中的文件非常大并且需要几分钟怎么办? 阅读?

如何在该代码或长时间执行其他操作 操作正在运行? 如果你在 java 中工作,这些问题就不会出现,因为你有很多线程可以为你工作(服务多个请求)


异步编程(Node.Js)

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

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

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

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

请注意,“从文件执行完成读取”这一行是在读取文件时执行的,因此允许我们在执行文件的主要读取的同时执行其他操作

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

这就是 Node 中异步编程的工作原理。

另外,如果你想比较 java 和 Node,你可以阅读这个Article


编辑:

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

假设:

1) 有单个服务器进程,比如serverProcess

2) 有 2 个客户端请求服务器,例如 clientAclientB

3) 现在,考虑 clientA,将需要一个文件操作(作为一个 如上所示,使用fs)。

这里发生了什么,

流程:

1)clientA请求serverProcess,服务器得到请求,然后 它开始执行文件操作。现在它等到文件 准备好读取(尚未调用回调)。

2)clientB请求serverProcess,现在服务器空闲了 现在,因为它不服务于clientA,所以它服务于clientB,在 同时,来自fs.read 的回调,通知服务器该文件 数据准备好了,可以对其进行操作了。

3) 现在服务器开始为“clientA”提供服务。

现在你看,只有一个 server 线程处理了两个客户端请求,对吧?


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

问题:

虽然调用了另一个从文件系统准备数据的进程,但如何说节点是单线程的:

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

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

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

【讨论】:

  • 很好的例子,知道fs.readFile这个操作是由谁做的吗?我的意思是,如果只有一个线程在处理来自外部的请求,谁来执行 readFile 操作?
  • 是的,后台进程会为您读取文件并提供数据,但最终回调仅由主(单)线程执行
  • 那么节点是如何单线程的?
  • @squiroid.. 单个线程在您的服务器上完成每个工作:当有**输入/输出**(这不是服务器在这里工作)时,这项工作将交给后台进程,当他们返回结果时,有相同的进程再次为他们服务..所以只有一个进程为您服务(所有 http 请求)。
  • 是的,只有一个线程来处理我的所有请求,但还有其他线程可以帮助主执行线程处理(I/),读取,写入)这些线程不属于节点?
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2013-04-08
  • 2016-08-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多