节点中的思考 if Java 背景
Thinking in node if Java background
我是一名 Java 开发人员,一切都按顺序(或与多个线程并发)一个接一个地工作。按顺序放置事物是合乎逻辑的。
但是节点以并发顺序与单线程一起工作。即使它只在单线程上工作,它又有什么好处?
老实说,我对node单线程的概念没有理解。只有一个线程处理所有事情?
关于如何开始使用 node 进行思考的任何建议都会对我有所帮助。
这已经说了百万遍了,但让我就 Java 给你一个简短的回答。
如果要读取长文件而不阻塞主线程,请在 Java 中创建单独的线程。
在Java脚本中,您只需使用回调读取文件。
两者的主要区别:
- 使用多线程(竞争条件等)更容易搞砸代码。
- 你并不需要CPU的第二个内核来读取文件,这是一个慢I/O、不密集通信的问题。
- 在回调中,如您所说,存在单线程。虽然,它只是要求底层系统读取文件,并继续执行您的代码。读取文件后,javascript 会暂停正在执行的代码,然后返回到 运行 您的回调。
有时,您还必须在 Java 脚本中执行计算密集型操作。在这种情况下,您可以生成一个新进程 - 查看 cluster 模块。但通常,计算或 I/O 繁重的操作已经为您完成,您只需使用回调来使用它们。
好的,让您抢先一步。它与线程无关,它与每秒的任务有关。在线程模式中,线程在等待某事时会阻塞。
在非阻塞设计中,每当您等待某事时,您只需返回线程并在您等待的事件发生时被唤醒。这些事件被称为未来。因此,将来我想在发生这种情况时执行此操作(或者在失败的情况下执行其他操作)。基本上就是这样。
它不是节点或 javascript。它也以 scala 闻名,当然还有很多其他语言。如果您是 Java 人,请寻找异步处理。 Jetty 提供了它。 Vertx 以无共享架构而闻名。
所以玩得开心。我经常使用它。我有一个服务器在自定义数据存储中存储 20GB 的数据。想知道我们是如何扩展的吗?我们为服务器带来了 512GB 的内存,并并行处理了其中的 20 家商店,不共享任何东西。这就像在一台机器上拥有 20 台服务器,没有明显的延迟,并且您可以随内核进行扩展。这就是我们在当今世界开展业务的方式。
硬件很便宜,所以为什么 fiddle 在最低级别上使用并发?
同步编程(Java)
如果您熟悉同步编程(编写一件事接一件事的代码),例如 Java 或 .Net。采取以下代码,
例如:
var fs = require('fs');
var content = fs.readFileSync('simpleserver1.js','utf-8');
console.log('File content: ');
console.log(content);
它将一个简单的 Web 服务器的代码写到控制台。代码按顺序工作,在下一行之后执行每一行。直到上一行执行完才执行下一行。
虽然这很有效,
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)
要在其他长操作为 运行 时执行操作,我们使用 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
注意“executed from the file finishes reading”这一行是在读取文件时执行的,因此允许我们在主要读取文件的同时执行其他操作也正在执行中
现在看看代码中的//xyz operation
。正在读取文件时,服务器不会等待文件完全读取。它将开始执行 //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 开发人员,一切都按顺序(或与多个线程并发)一个接一个地工作。按顺序放置事物是合乎逻辑的。 但是节点以并发顺序与单线程一起工作。即使它只在单线程上工作,它又有什么好处?
老实说,我对node单线程的概念没有理解。只有一个线程处理所有事情?
关于如何开始使用 node 进行思考的任何建议都会对我有所帮助。
这已经说了百万遍了,但让我就 Java 给你一个简短的回答。
如果要读取长文件而不阻塞主线程,请在 Java 中创建单独的线程。
在Java脚本中,您只需使用回调读取文件。
两者的主要区别:
- 使用多线程(竞争条件等)更容易搞砸代码。
- 你并不需要CPU的第二个内核来读取文件,这是一个慢I/O、不密集通信的问题。
- 在回调中,如您所说,存在单线程。虽然,它只是要求底层系统读取文件,并继续执行您的代码。读取文件后,javascript 会暂停正在执行的代码,然后返回到 运行 您的回调。
有时,您还必须在 Java 脚本中执行计算密集型操作。在这种情况下,您可以生成一个新进程 - 查看 cluster 模块。但通常,计算或 I/O 繁重的操作已经为您完成,您只需使用回调来使用它们。
好的,让您抢先一步。它与线程无关,它与每秒的任务有关。在线程模式中,线程在等待某事时会阻塞。
在非阻塞设计中,每当您等待某事时,您只需返回线程并在您等待的事件发生时被唤醒。这些事件被称为未来。因此,将来我想在发生这种情况时执行此操作(或者在失败的情况下执行其他操作)。基本上就是这样。
它不是节点或 javascript。它也以 scala 闻名,当然还有很多其他语言。如果您是 Java 人,请寻找异步处理。 Jetty 提供了它。 Vertx 以无共享架构而闻名。
所以玩得开心。我经常使用它。我有一个服务器在自定义数据存储中存储 20GB 的数据。想知道我们是如何扩展的吗?我们为服务器带来了 512GB 的内存,并并行处理了其中的 20 家商店,不共享任何东西。这就像在一台机器上拥有 20 台服务器,没有明显的延迟,并且您可以随内核进行扩展。这就是我们在当今世界开展业务的方式。
硬件很便宜,所以为什么 fiddle 在最低级别上使用并发?
同步编程(Java)
如果您熟悉同步编程(编写一件事接一件事的代码),例如 Java 或 .Net。采取以下代码, 例如:
var fs = require('fs');
var content = fs.readFileSync('simpleserver1.js','utf-8');
console.log('File content: ');
console.log(content);
它将一个简单的 Web 服务器的代码写到控制台。代码按顺序工作,在下一行之后执行每一行。直到上一行执行完才执行下一行。
虽然这很有效,
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)
要在其他长操作为 运行 时执行操作,我们使用 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
注意“executed from the file finishes reading”这一行是在读取文件时执行的,因此允许我们在主要读取文件的同时执行其他操作也正在执行中
现在看看代码中的//xyz operation
。正在读取文件时,服务器不会等待文件完全读取。它将开始执行 //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
andclientB
.3) Now, consider clientA, is going to require a file Operation(as one shown above using
fs
).
这里发生了什么,
Flow:
1)
clientA
requestsserverProcess
, 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
requestsserverProcess
, Now the server is free right now, as it is not servingclientA
, so it servsclientB
, in the mean-time, the callback fromfs.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 将自己创建另一个线程来处理新请求。