有没有办法在NodeJS中进行多线程编码?

时间:2011-10-27 01:50:04

标签: javascript multithreading node.js

根据我的理解,只有NodeJS中的I / O是非阻塞的。例如,如果我们执行大量繁重的数学运算,则其他用户在完成之前无法访问服务器。

我想知道在NodeJS中是否存在非阻塞方式来进行大量计算?好奇。

7 个答案:

答案 0 :(得分:9)

如果您想要对Node进行长时间运行的计算,那么您将需要启动一个单独的进程来处理这些计算。通常,这可以通过创建一些单独的工作进程并将计算传递给它们来完成。通过这样做,您可以保持主节点事件循环不受阻挡。

在实施方面,您有两个主要选择。

  1. 第一个是您使用Node's child-process API 函数手动分离子进程。这个很好,因为你的计算甚至不必是javascript。运行计算的子进程甚至可以是C或其他。
  2. 或者,如果您Web Worker specificationNPM可通过search for 'worker'提供多种实施方案。我不能说这些工作有多好,因为我没有使用过,但它们可能是要走的路。
  3. 更新

    我现在选择选项一。当前的子进程API支持以类似工作人员的方式在进程之间发送消息和对象,因此几乎没有理由使用单独的工作模块。

答案 1 :(得分:2)

您可以使用Hook.io为繁重的计算运行单独的节点进程,并在两者之间进行通信。 Hook.io特别有用,因为它具有自动修复网格,这意味着如果你的一个钩子(进程)崩溃,它可以自动重启。

答案 2 :(得分:1)

使用多个NodeJS实例并通过套接字进行通信。

答案 3 :(得分:1)

使用多个节点实例并通过node-zeromq,HTTP,普通TCP套接字,IPC(例如unix域套接字),JSON-RPC或其他方式进行通信。或者按照上面的建议使用web worker API。

多实例方法有其优点和缺点。缺点是存在启动这些实例和实现自己的交换协议的负担。优点是可以扩展到许多计算机(而不是单个计算机中的许多核心/处理器)。

答案 4 :(得分:0)

我认为这是迟到的,但这是你要了解的nodejs的一个很棒的功能。

多线程的唯一方法就是产生新的进程,到目前为止。 但是nodejs在生成的节点叉之间具有实现的消息功能。 http://nodejs.org/docs/latest/api/child_processes.html#child_process.fork 来自开发人员的出色工作,您可以将对象等作为消息传递给您的孩子和向后

答案 5 :(得分:0)

您可以使用节点群集模块。

https://nodejs.org/api/cluster.html

答案 6 :(得分:0)

我会使用JXCore - 它是一个基于nodejs的抛光引擎,可以运行你的代码,但有几个选项,包括你要搜索的多线程。在生产中运行这是一个魅力! 项目来源:https://github.com/jxcore/jxcore

功能包括:

  • 支持核心Node.JS功能
  • 嵌入式界面
  • 发布到移动平台(Android,iOS ..)
  • 支持多个JavaScript引擎
  • 多线程功能
  • 流程配置&监测
  • 内存中文件系统
  • 应用程序打包
  • 支持最新的JavaScript功能(ES6,ASM.JS ...)
  • 支持通用Windows平台(uwp)api