【问题标题】:How does node js do it better?node js如何做得更好?
【发布时间】:2017-12-10 22:12:10
【问题描述】:

nodejs 的单线程异步处理模型如何以及何时比 PHP、Java 和 C# 等已知服务器大师的多线程方法更好?谁能简单清楚的给我解释一下?

我的问题是,从技术上讲,单线程异步处理模型是一种更好的方法吗?

【问题讨论】:

  • 不,不是。请理解我的问题
  • 真的,你读了吗?似乎很好地回答了你的问题。
  • 如果不是答案,请清楚地重新表述您的问题

标签: javascript node.js


【解决方案1】:

Grasping the Node JS alternative to multithreading

Node.js 是作为异步处理的实验显式创建的。理论上,在单线程上进行异步处理可以在典型的 Web 负载下提供比典型的基于线程的实现更高的性能和可扩展性。 单线程、异步的特性确实使事情变得复杂。但是你真的认为它比线程更复杂吗?一个比赛条件可能会毁了你整个月!或者由于某处的某些设置而清空您的线程池,并观察您的响应时间缓慢到爬行!更不用说死锁、优先级反转以及多线程带来的所有其他问题。

但它真的是单线程吗?阅读这篇文章https://softwareengineeringdaily.com/2015/08/02/how-does-node-js-work-asynchronously-without-multithreading/

【讨论】:

    【解决方案2】:

    Node.js 建立在 Google 的 V8 引擎之上,该引擎反过来编译 JavaScript。众所周知,JavaScript 本质上是异步的。异步是一种提供非阻塞代码特性的编程模式,即不停止或不依赖另一个函数/进程来执行特定的代码行。异步在性能、资源利用率和系统吞吐量方面都很好。但也有一些缺点: 传统程序员很难继续使用异步。 处理控制流真的很痛苦。 回调是脏的。

    NodeJS 是单线程的,它并不是真正的威慑或性能障碍。单线程事件循环非常高效,并且比部署有效的多线程要简单得多。多线程并不总是意味着更好的性能。

    话虽如此,如果您确实需要处理大量并发,那么您可以使用集群模块的服务,该模块将多个 NodeJS 进程拆分到可用的 CPU 内核上,同时保持与可以使用的主进程的链接控制/卸载处理任务。

    【讨论】:

      【解决方案3】:

      Node 从一开始就考虑到了异步性,利用了 JavaScript 的事件循环。当请求完成某些类型的工作(例如数据库请求)时,它可以通过不等待请求来快速处理大量请求。

      假设您有一个需要 10 秒才能完成的数据库操作,用 setTimeout 表示

      router.route('/api/delayed')  
       .get(function(req, res) {
      setTimeout(function() {
        res.end('foo');
      }, 10000);
      });
      
      router.route('/api/immediate')  
       .get(function(req, res) {
      res.end('bar');
      });
      

      或不支持异步执行的后端框架,这种情况是一种反模式:服务器将在等待数据库操作完成然后执行请求时挂起。在 Node 中,它触发操作,然后返回以准备处理下一个传入请求。操作完成后,将在即将到来的事件循环周期中进行处理,并满足请求。

      只要我们只写非阻塞代码,我们的 Node 服务器就会比其他后端语言表现得更好

      【讨论】:

        【解决方案4】:

        在阅读了这本书:Web Development with MongoDB and Node.js Maithun Satheesh、Jason Krol 和 Bruno Joseph D'mello 的第二版后,我终于发现了一个明显的优势 p>

        要理解这一点,我们应该了解 Node.js 的问题 试图解决。它尝试对单个进行异步处理 线程为应用程序提供更高的性能和可扩展性 应该处理太多的网络流量。想象网络 处理数百万并发请求的应用程序;如果 服务器创建一个新线程来处理每个进来的请求,它 会消耗大量资源,我们最终会尝试添加 越来越多的服务器以增加应用程序的可扩展性。 单线程异步处理模型有它的优势 在前面的上下文中,您可以处理更多并发 服务器端资源数量较少的请求。

        我注意到可以用更少的服务器端资源处理更多的并发请求

        【讨论】:

          【解决方案5】:

          我的 2 便士值....我不确定“nodejs 的单线程方法是否更好”:简单地说,nodejs 不支持多线程。可以松散地翻译为“一切都在一个线程中运行”。现在,我不太确定它如何与多线程系统“比较”,因为“多”线程系统可以同时支持单线程(如 nodejs)和多线程。这一切都在您的应用程序设计和您可用的平台功能中。

          在我看来,更重要的是能够以异步方式支持多任务。Nodejs 确实在一个简化且易于使用的包中提供了对多任务的支持。由于缺乏对多线程的本机支持,它确实有局限性。要利用多线程的多任务处理(而不用担心......太多),请按照将服务器端应用程序设计为在很长一段时间内执行小块工作的思路进行思考,然后调用每个工作块,并消费从客户端生成的事件。考虑一个事件驱动的设计/架构(循环、回调和数据检查点到文件或数据库的简单开关/案例,可以做到这一点)。我敢打赌,如果你让你的应用程序以这种方式工作,没有多线程,那将是一个更好的设计,更健壮,如果你迁移它(并适应多线程)它像 SpaceX 破坏者一样奔跑!
          虽然多线程对于服务器端实现来说是一个加分项,但它也是一个强大的野兽,需要大量的经验和对驯服和利用的尊重(nodejs 屏蔽/保护你的东西)

          另一种看待方式是:多任务是应用程序级别(运行多个任务)的视角,而多线程是较低级别的视角:多任务可以映射到不同的实现,多线程就是其中之一。

          多线程能力

          • 真相:Node.js(目前)在低级执行/处理线程的意义上不提供对多线程的本机支持。 Java 及其实现/框架为多线程提供本机支持,并且也广泛提供(抢占、多租户、同步多线程、多任务、线程池等)

          • Pants on Fire(ish):Nodejs 中缺乏多线程是一个阻碍。 Nodejs 是围绕事件驱动架构构建的,在该架构中,事件会尽可能快地生成和使用。对功能回调有本机支持。根据应用程序设计,这种高级功能可以支持线程可以完成的工作。 s

          • 对于服务器端应用程序,在应用程序级别,重要的是能够同时执行多个任务:即多任务处理。有几种方法可以实现多任务。多线程就是其中之一,并且非常适合该任务。也就是说,“多线程”的概念是一个低级平台方面。例如java等多线程平台,托管/运行在单核进程服务器(具有1个CPU处理器核心的服务器)上仍然支持应用程序级别的multi-multi,映射到低级别的多线程,但实际上,只有一个线程可以在任何时间执行。在具有 4 个内核的多核机器上,支持在应用程序级别进行相同的多任务处理,并且在任何给定时间最多可以同时执行 4 个线程。关键是,在大多数情况下,真正重要的是对多任务的支持,这并不总是多线程的同义词。

          • 回到 node.js ,真正的讨论应该是关于应用程序设计和架构,更具体地说,是对多任务的支持。一般来说,服务器端应用程序和客户端或独立应用程序之间存在一个完整的范式转换,在设计和流程方面更是如此。除此之外,服务器端应用程序需要与其他应用程序一起运行(在服务器上),需要有弹性和自包含(当应用程序失败或崩溃时不影响服务器的其余部分),执行健壮的异常处理(即从错误,甚至是严重错误)并且需要执行多项任务。

          • 仅支持多任务的能力是任何服务器端技术的关键能力。而 node.js 具有这种能力,并且以非常易于使用的封装形式呈现。这一切都意味着服务器端应用程序的设计需要更多地关注多任务,而不是仅仅关注多线程。是的,在支持多线程的服务器端平台上工作有其明显的好处(增强的功能、性能),但仅此一项并不能解决在应用程序级别支持多任务的需求。任何用于服务器端应用程序和 node.js 的可靠应用程序设计都必须基于通过事件生成和消费(事件处理)进行的多任务处理。在 node.js 中,使用函数回调和小型事件处理器(作为函数)以及跨事件处理实例的数据检查点(保存处理数据,在文件或数据库中)是关键。

          Node.js 与 Java 的区别

          • 还有更多!考虑可扩展性、代码管理、功能集成、向后、向前兼容性、投资回报、敏捷性、生产力……
          • ,…为了减少这篇文章的“冗长”,双关语的意思:),我们暂时把它留在这里:) 不管你是否同意,请拍信使(Quora)而不是意见!

          【讨论】:

            猜你喜欢
            • 2011-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-11
            • 2015-10-31
            • 2016-04-30
            相关资源
            最近更新 更多