【问题标题】:is it possible to achieve multithreading in nodejs? [duplicate]是否可以在nodejs中实现多线程? [复制]
【发布时间】:2017-02-23 00:18:51
【问题描述】:

Node.js 多线程。

是否可以在 Node.js 中使用多线程?如果是的话。

在 Node.js 中使用多线程有哪些优点和缺点? Node.js 中可以实现多线程的模块有哪些?我是 Node.js 的新手,我从很多博客中读到 Node.js 是单线程的。

我知道 java 多线程,但我需要知道它在 Node.js 中是否可行。

【问题讨论】:

  • 从 Node 10.5 开始,没有一个答案是正确的,因为引入了真正的线程。请参阅medium.com/dailyjs/… 以获得精彩的介绍

标签: javascript node.js


【解决方案1】:

是和否。让我们从头开始。为什么NodeJs是单线程的,这里解释一下Why is Node.js single threaded?

虽然 Node.js 本身是多线程的——I/O 和其他此类操作从线程池运行——但 Node.js 执行的 JavaScript 代码出于所有实际目的在单个线程中运行。这不是 Node.js 本身的限制,而是 V8 JavaScript 引擎和 JavaScript 实现的一般限制。

Node.js 包含用于集群多个 Node.js 进程的本机机制,其中每个进程在单独的核心上运行。但这种集群机制不包括任何本地路由逻辑或工作人员之间的共享状态。

一般来说,更明确的说法是,每个 node.js 进程都是单线程的。如果你想要多个线程,你也必须有多个进程。 例如,您可以为此使用子进程,此处描述为http://nodejs.org/api/child_process.html。只是为了您的信息,请查看这篇文章,它非常有启发性且写得很好,如果您想使用 child_processes,可能会对您有所帮助 -- https://blog.scottfrees.com/automating-a-c-program-from-a-node-js-web-app

尽管如此,你可以实现一种多线程用C++和原生nodejs C++开发。

首先看看这些答案,也许它们会对你有所帮助,

How to create threads in nodejs

Node.js C++ addon: Multiple callbacks from different thread

Node.js C++ Addon: Threading

https://bravenewmethod.com/2011/03/30/callbacks-from-threaded-node-js-c-extension/

当然,您可以找到并利用许多提供“多”线程功能的节点插件:https://www.npmjs.com/search?q=thread

另外可以查看JXCorehttps://github.com/jxcore/jxcore JXCore 是 Node.js 的分支,允许 Node.js 应用程序在同一进程中的多个线程上运行。所以很可能 JXCore 是适合您的解决方案。

“在 Node.js 中使用多线程有什么优点和缺点?”

这取决于你想做什么。如果您正确地利用和使用 Node.js 源代码,并且您的“多”线程插件或进程或其他任何东西,不会“破解”或滥用 V8 或 Node.js 核心中的任何内容,则没有任何缺点!

与每个答案一样,正确答案是“使用正确的工具完成工作”。 当然,由于节点设计为单线程,因此您可以有更好的多线程方法。

很多人使用的一种技术是用 C++、Java、Python 等编写多线程应用程序,然后通过自动化和 Node.js child_process 运行它(第三方应用程序与自动化异步运行,您有更好的性能(例如 C++ 应用程序),并且您可以在 Node.js 应用程序中发送输入和获取输出)。

多线程 Node.js 的缺点

检查这个:https://softwareengineering.stackexchange.com/questions/315454/what-are-the-drawbacks-of-making-a-multi-threaded-javascript-runtime-implementat

请记住,如果您想通过修改 Node.js 来创建一个纯多线程环境,我认为这将是困难的,由于复杂性而存在风险,而且您必须始终与每个新的V8 或 Node 版本可能会影响这一点。

希望这会有所帮助。

【讨论】:

  • python不是 一种抢占式多线程语言,与 node.js 相比是浪费时间。让我们坚持使用真正支持多线程的 c/C++ 或 jvm 语言。
【解决方案2】:

不,您不能在 node.js 中使用线程。它使用异步代码执行模型。在异步模型背后,节点本身使用线程。但据我所知,如果没有额外的库,它们是无法在应用中访问的。

使用异步模型,您实际上不需要线程。这是一个简单的例子。通常,在多线程环境中,您会在每个线程中运行网络请求,以免阻塞主线程中的代码执行。使用异步模型,这些请求不会阻塞主线程,仍然会在其他线程中执行,只是对您隐藏了这一点,使开发过程变得简单。

同时检查this comment by bazza。

【讨论】:

  • 但是 npm 中列出的一些用于多线程的模块,您对此有何看法...
  • @UmakantMane,更多信息请阅读the linked answer。这些线程本身并没有公开,您应该使用特殊的库来访问它们。我的意思是你可能不需要这个。
  • 谢谢,你能列出 nodejs 中多线程的至少一个缺点
  • @UmakantMane,不支持开箱即用,可能表示对异步模型的理解不正确
  • 值得补充的是,Node.JS 正在实现一个 Actor Model 编程框架。开始混合不同的东西(比如单个节点中的多个线程)是复杂的,而且有点错过了重点。 Node.JS 支持代码中的异步消息传递。拥有第二个实例,并使用该异步消息在它们之间进行通信。
猜你喜欢
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多