【问题标题】:Grasping the Node JS alternative to multithreading掌握 Node JS 的多线程替代方案
【发布时间】:2011-07-09 05:16:35
【问题描述】:

如果我理解正确,Node JS 是非阻塞的......所以它不是等待来自数据库或其他进程的响应,而是转移到其他东西并稍后再检查。

它也是单线程的。

这是否意味着给定的 Node JS 进程可以充分有效地利用单个 CPU 内核,但不会使用机器上的任何其他内核,例如,它一次永远不会使用多个内核。

这当然意味着其他 CPU 仍然可以被其他进程用于 SQL 数据库或其他有意分离的 CPU 繁重的子例程,只要它们是一个单独的进程。

此外,如果 Node JS 进程具有无限循环或长时间运行的函数,则该进程在任何情况下都不再有用,直到无限循环或长时间运行的函数停止(或整个进程终止)。

这一切都好吗?我的理解正确吗?

【问题讨论】:

标签: multithreading node.js


【解决方案1】:

是的,我想说你的理解是完全正确的。 This article (archived) 很好地解释了这种设计背后的基本原理。这可能是最重要的一段:

Apache 是多线程的:它为每个请求(或进程,取决于 conf)生成一个线程。您可以看到随着并发连接数量的增加以及需要更多线程来服务多个同时的客户端,这种开销是如何消耗内存的。 Nginx 和 Node.js 不是多线程的,因为线程和进程会占用大量内存。它们是单线程的,但基于事件。这通过在单个线程中处理许多连接消除了由数千个线程/进程产生的开销。

【讨论】:

  • 这篇文章是假的。尽管存在多线程 apache mpm,但它与几乎所有日常使用的配置都不兼容。 Apache 是多进程的,直到现在还不是多线程的,而且可能永远都是。我觉得这是灾难性的,操纵术语的正确含义只是隐藏问题而不是解决问题的好方法。
  • @peterh 你没有道理。这篇文章是完全正确的,说明 apache 是多进程或多线程的,具体取决于配置。在处理许多连接方面,多进程情况甚至更糟,这是首先提到 Apache 的唯一原因。此外,非常常用的 PHP 模块本身就是多线程的。最后,虽然我不是 apache 专家,但我从其他文章中得到的印象是,worker MPM 实际上非常常用。
  • @MichaelBorgwardt 是的,apache 可以是多线程的,也可以是多进程的,我没有否认。但是 php 与多进程配置不兼容,如果您是 apache 专家,您肯定会知道。非常常用的 php 模块不是多线程的。你的信息是假的。我建议尝试一个测试配置,你会看到。这是事实,没有争议,尝试一下,你就会看到。
【解决方案2】:

非常正确,是的。 node.js 服务器有一个内部线程池,因此它可以执行阻塞操作,并在事情完成时通过回调或事件通知主线程。

所以我想它会限制使用线程池的另一个内核,例如,如果您执行非阻塞文件系统读取,这可能是通过告诉线程池中的线程执行读取和设置来实现的完成后的回调,这意味着读取可能发生在不同的线程/核心上,而主 node.js 程序正在执行其他操作。

但从 node.js 的角度来看,它完全是单线程的,不会直接使用多个内核。

【讨论】:

  • 我还是 Node.js 的新手,感谢这里的讨论。我只是想指出,假设非阻塞调用由线程阻塞调用支持可能是不明智的(不是@jcoder 建议围绕这些假设构建代码)。在这种情况下,即使 IO 是在具有阻塞调用的单独线程上处理的,该线程基本上无论如何都会等待 IO,因此它不会使用其他内核/CPU。根据您正在使用的工具的强度编写代码,不要太担心底层细节(直到它们成为问题)。
  • 这样我们就可以在前端使用诸如javascript代码之类的回调来做其他散文
【解决方案3】:

自从这个问题大约 2 年前提出以来。事情正在变得不同,或者 Node.JS 上的多线程问题有替代方法

根据下面的博客文章,使用传入的“任务”扩展,一些可以直接受益于其他可用内核。

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

【讨论】:

    【解决方案4】:

    即使这是一个旧线程,我想,我也会分享一个想法,即如何在 Node.JS 应用程序中利用多个内核。正如 Nuray Altin 所提到的 - JXcore 可以做到这一点。

    简单示例:

    var method = function () {
        console.log("this is message from thread no", process.threadId);
    };
    
    jxcore.tasks.runOnThread(0, method);
    jxcore.tasks.runOnThread(1, method);
    
    // this is message from thread no 1
    // this is message from thread no 0
    

    默认有两个线程(你可以用jxcore.tasks.setThreadCount()改变它)

    当然,您可以对任务做更多的事情。文档是here

    关于该主题的文章很少:

    【讨论】:

      【解决方案5】:

      Node.js 是一个单线程应用程序,但它可以通过事件和回调的概念来支持并发。这是 Philip Roberts 的视频,它解释了事件循环在 javascript 中的工作原理。

      Click here to see the video

      (Node.js 中有 C++ API 代替 WebAPI)

      【讨论】:

      • 这应该是一条评论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多