Java背景下的节点思考

Java背景下的节点思考,java,javascript,node.js,asynchronous,Java,Javascript,Node.js,Asynchronous,我是一名Java开发人员,在这里,一切都以顺序方式(或与多个线程并发)一个接一个地工作。按顺序排列是合乎逻辑的。 但节点以单线程的并发顺序工作。即使它只在单线程上工作,它又有什么好处呢 坦白地说,我没有在节点中得到单线程的概念。只有一条线可以处理一切 任何关于如何开始在node中思考的建议都是有益的。这已经说过无数次了,但让我给你一个关于Java的简短回答 如果您想在不阻塞主线程的情况下读取长文件,可以在Java中创建单独的线程 在Javascript中,您只需使用回调读取文件 这两者之间的主要

我是一名Java开发人员,在这里,一切都以顺序方式(或与多个线程并发)一个接一个地工作。按顺序排列是合乎逻辑的。 但节点以单线程的并发顺序工作。即使它只在单线程上工作,它又有什么好处呢

坦白地说,我没有在节点中得到单线程的概念。只有一条线可以处理一切


任何关于如何开始在node中思考的建议都是有益的。

这已经说过无数次了,但让我给你一个关于Java的简短回答

如果您想在不阻塞主线程的情况下读取长文件,可以在Java中创建单独的线程

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

这两者之间的主要区别是:

  • 使用多线程(争用条件等)更容易使代码出错
  • 读取文件并不需要CPU第二个内核的能力,这是一个I/O速度慢的问题,而不是密集的通信
  • 在回调中,正如您所说,只有一个线程。不过,它只要求底层系统读取文件,并继续执行代码。一旦文件被读取,javascript就会暂停它正在执行的代码,并返回运行回调

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

    好吧,让您有一个领先的开始。它不是关于线程,而是关于每秒的任务。在线程模式中,线程在等待某些内容时会阻塞

    在非阻塞设计中,每当您等待某件事情时,您只需返回线程,并在等待的事件发生时被唤醒。这些事件被称为未来。所以在将来,我想在发生这种或那种情况时做这件事(或者在失败的情况下做另一件事)。基本上就是这样

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

    祝你玩得开心。我经常使用它。我有一个服务器,在自定义数据存储中存储20GB的数据。想知道我们是怎么做到的吗?我们为服务器带来了512GB,其中20个存储并行运行,不共享任何内容。这就像在一台机器上有20台服务器,没有明显的延迟,并且可以通过核心进行扩展。这就是我们在当今世界做生意的方式


    硬件很便宜,为什么要在最底层处理并发呢?

    同步编程(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)

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

    因此,异步编程应运而生,可以帮助您使用javascript(节点)

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

    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操作
    。读取文件时,服务器不会等待文件被完全读取。它将开始执行
    //xyz操作
    ,并在文件准备就绪时返回到
    fs.readFile(
    )中提供的回调函数

    这就是异步编程在节点中的工作方式

    如果您想比较java和Node,也可以阅读以下内容
    编辑:

    node.Js单线程如何 让我们看一个场景,其中客户端请求服务器:

    假设:

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

    2) 有两个客户端请求服务器,例如
    clientA
    clientB

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

    fs

    这里发生了什么

    流量:

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

    2)
    clientB
    请求
    serverProcess
    ,现在服务器是自由的了 现在,由于它不服务于
    clientA
    ,因此它在 同时,来自
    fs.read
    的回调通知服务器该文件 数据准备就绪,可以对其执行操作

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

    现在你看,只有一个服务器线程,它处理两个客户端请求,对吗?
    如果这是JAVA,那么会发生什么呢?您会创建另一个服务器线程来服务
    clientB