NodeJS 中是否可以实现多线程?

2024-02-17

所以我有一个应用程序Socket.IO其目的是在不同站点上搜索一些数据。像爬虫之类的东西...主要问题是搜索过程太长,当它发生时我的应用程序卡住了...例如,如果一个用户开始第二次搜索需要等到第一次完成...

每个需要搜索的网站都表示为一个单独的类,因此我执行以下操作:

selected_sites.forEach(function(site_name) {
    var site = new sites[site_name];

    site.on('found', function(data) {
        socket.emit('found', data);
    });

    site.on('not_found', function() {
        socket.emit('not_found', 'Nothing found at ' + site.getSiteName());
    });

    site.search(socket_data.params);
});

是否有可能以某种方式将“类主体|搜索进度”移动到“其他地方|在新线程中”,以便在搜索进行时事件循环不会被阻止?


Node.js 不允许您同时运行多个 Javascript 执行线程。单个 Node.js 进程一次仅运行一个 Javascript 执行线程。由于异步 I/O,多个 Javascript 操作可能在任何给定时间“进行中”,但在任何给定时间只有一个实际上在运行(而其他操作可能正在等待 I/O 操作完成)。

如果您希望在后台运行一些运行时间较长和/或 CPU 密集型应用程序,同时您的服务器可以自由地处理传入请求,那么解决此问题的常用方法是将耗时的操作移至其自己的 Node.js 进程中(通常使用子进程模块 https://nodejs.org/api/child_process.html),然后允许这两个进程根据需要共享信息,无论是通过数据库还是通过某些进程间通信(如套接字)。

如果您有多个 CPU 密集型操作,您可以启动多个辅助进程,或者可以使用Node.js 集群模块 https://nodejs.org/api/cluster.html为了最大限度地利用主机中的所有 CPU。

您应该知道,如果您的大部分代码只是网络或文件 I/O,那么这一切都可以通过异步操作来完成,并且您的 Node.js 服务器将很好地扩展以并行执行许多不同的事情。如果您有 CPU 密集型操作(大量解析或计算),那么您将需要启动多个进程,以便更有效地利用多个 CPU,并让系统时间片为您完成工作。

2020年更新:Nodejs 现在有线程了。您可以使用工作线程 https://nodejs.org/api/worker_threads.html。这对于并行化 I/O 操作不是必需的,但对于并行化 CPU 密集型操作和利用多个 CPU 内核可能很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS 中是否可以实现多线程? 的相关文章

  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • Node.js 上的 Connect 出现“无法 GET /”

    我正在尝试使用以下方式开始提供一些静态网页connect像这样 var connect require connect var nowjs require now var io require socket io var app conne
  • 异步减少返回承诺

    我有一个对象数组 我必须为来自异步函数的每个对象添加一个属性 我正在执行 Array reduce 来迭代每个元素并仅返回一个结果 具有新属性的一个对象数组 我有这个 const res await resultOne reduce asy
  • 如何在nodejs中使用crypto.randomBytes使用async/await?

    const crypto require crypto async function getKey byteSize let key await crypto randomBytes byteSize return key async fu
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • SQLite同时读写

    我读过很多主题 但无法找到问题的答案 是否可以同时读写 我有后台线程更新一些数据 UI 需要存储在数据库中的一小部分数据 所以在UI线程中执行SELECT操作 但当更新正在进行时它会阻塞 结果 UI 冻结了几秒钟 有人在写入时成功从数据库读
  • 如何执行密集的 Node.js 计算

    我正在开发一个电子商务应用程序 每次产品从服务器发送到客户端时都必须重新计算产品的定价 每次发送多达数千个产品 计算部分本身相当密集 因为它需要多个数据库查询来计算 我的简单解决方案是将计算部分抽象到另一个专门用于计算的 Node js 应
  • Node.js 中的 Twilio 短信回复

    我正在使用 node js 中的 twilio 编写移动通知系统 目前可以向用户发送短信 但我希望用户能够回复我 我需要收集用户发送文本的电话号码以及消息的内容 以查询我的 mongoosedb 我找不到太多这方面的信息 因此非常感谢您的帮
  • 如何在浏览器同步中配置端口

    我有一个gulp任务运行于browser sync 默认情况下它运行在node js服务器的端口3000上 我想将默认端口更改为任何其他端口 例如3010 var gulp require gulp connect require gulp
  • 从 Node.js 调用 execl、execle、execlp、execv、execvP 或 execvp 的方法

    POSIX 系统公开了一系列exec函数 允许人们将可能不同的东西加载到当前进程中 保留打开的文件描述符 进程标识符等 可以出于多种原因执行此操作 在我的情况下 这是引导 我想更改我自己的进程的命令行选项 然后在现有进程上重新加载它 这样就
  • Node.js 请求随机开始挂起,直到服务器重新启动后才会清除

    我在我们的网络应用程序上遇到了一个非常奇怪且看似随机的问题 我似乎无法成功调试 它可以正常运行 10 分钟到 6 小时 然后突然无法向服务器发出或从服务器发出远程请求 它们只是挂起 这包括常规的 http 和 Web 套接字请求 奇怪的是
  • Angular 和 Node JS 中的路由问题 [Angular]

    我有角度js的问题 我创建了 login html 和 home html 成功登录后我想将页面更改为 home html 我的路由不起作用 默认 url 是 localhost angular 我尝试路由 realpath 即 local
  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • Node.js es6 使用index.js 导出/导入

    我有以下文件夹结构 src index js lib test js dist examples example js src lib test js export default class Test src index js impor
  • 类验证器 (Node.js) 在自定义验证中获取另一个属性值

    目前 我有一个非常简单的类验证器文件 其中包含 Nest js 中的 ValidationPipe 如下所示 import IsDateString IsEmail IsOptional IsString Length Max from c
  • GraphQL - POST 正文丢失。您忘记使用 body-parser 中间件了吗?

    我的电脑上不断出现以下错误graphql查询但不确定原因 POST body missing Did you forget use body parser middleware 我在这里做了什么奇怪的事吗 我已经尝试了在线 body par
  • “benaphores”值得在现代操作系统上实施吗?

    当我还是一名 BeOS 程序员时 我读过本文 http www haiku os org legacy docs benewsletter Issue1 26 html Engineering1 26作者 Benoit Schillings
  • 在 AWS Lambda 中共享代码

    在 AWS Lambda 函数之间共享代码的首选方式是什么 我有这样的结构 functions a 节点模块 index js 包 json b 节点模块 index js 包 json c 节点模块 index js 包 json 这让每
  • 使用任何节点模块在内存中创建 ZIP 文件

    是否有任何节点模块可以在内存中创建 zip 我不想将 zip 文件保存在磁盘上 以便我们可以将这个创建的 zip 文件发送到其他服务器 从内存 做这个的最好方式是什么 这是我的例子 var file system require fs va
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中

随机推荐

  • Plotly-Dash:如何确定客户端回调中的触发输入

    Dash 的文档描述了在服务器端回调的情况下如何确定哪个输入触发了回调 高级回调 https dash plotly com advanced callbacks 有没有办法确定哪个输入触发了客户端打回来 看起来这个功能是在1 13 0版本
  • REST - 修改部分资源 - PUT 或 POST

    我看到很多关于如何使用 REST 只更新部分资源 例如状态指示器 的问题 选项似乎是 抱怨 HTTP 没有 PATCH 或 MODIFY 命令 然而 接受的答案REST 的 HTTP MODIFY 动词 https stackoverflo
  • 获取当前行的长度

    我正在尝试在状态行中添加一个指示符来显示行的总长度 不仅仅是光标列位置 可以用 c 我该怎么做呢 要将一行内容作为字符串获取 请使用getline
  • 抓取无限滚动页面停止而不滚动

    我目前正在使用 PhantomJS 和 CasperJS 来抓取网站中的链接 该网站使用 JavaScript 动态加载结果 然而 下面的代码片段并没有让我获得页面包含的所有结果 我需要的是向下滚动到页面底部 查看微调器是否显示 意味着还有
  • 一次从单个设备登录,注销其他 MERN、JWT、Google 登录

    我无法理解应该如何防止同一用户多次登录 我在带有 JWT 令牌的 React Node 应用程序中使用带有 firebase 的 google 登录 如果从其他浏览器或其他设备登录 如何使用户注销 有没有任何库可以处理这个问题或者有什么方法
  • 如何在同一个库中拥有多个wpf自定义控件?

    我有一个 WPF 自定义控件项目 我想在其中包含许多自定义控件 默认情况下 VS2015 cummunity 创建一个 Theme 文件夹 其中包含 generic xaml 文件和包含交互逻辑的 cs 文件 我想要有很多用户控件 所以我尝
  • 从外部站点动态加载 js

    我想当用户单击按钮时从外部站点加载 JS 代码 例如
  • 如何在 ngTagsInput 中设置标签的颜色?

    我想在我的项目中使用 ng tags input 我尝试根据数组中的颜色属性对象为每个标签设置不同的颜色 Here is plunker http plnkr co edit W5bjrwN5riL94i2jhOP3 p preview我正
  • 反转字符串中元素的顺序

    我有以下字符串 1119 2 483 11021 我想反转该字符串中元素的顺序 期望的输出 11021 483 2 1119 T SQL 版本 2014 您需要一个有序的 split 函数 例如 灵感 https www sqlserver
  • 线程如何节省时间?

    我正在学习 C 中的线程 但是 我无法理解线程的哪些方面实际上提高了性能 考虑仅存在一个核心处理器的场景 将任务拆分为多个线程使用相同的进程上下文 共享资源 并且它们同时运行 由于线程只是共享时间 为什么它们的运行时间 周转时间 小于单线程
  • Html5画布文本交叉点

    我有一些话 所有话都在某个 物体 之王中 这些单词可以在画布上移动 我需要获取所有交叉点的数组 如本例所示 但不需要将文本转换为 SVG paperjs org examples path intersections 谢谢 您可以通过比较两
  • 如何在python源代码中找到运算符的定义?

    我对 in 的实现感到好奇 contains python 中的运算符由于这个问题 https stackoverflow com questions 9089400 python set in operator uses equality
  • 如果页面加载失败,如何运行 Tampermonkey 脚本?

    我有一个在服务器页面上运行的脚本 有时发送不会将任何内容发送回客户端 我得到未收到数据Chrome 中的错误 我想注册此事件 通过 AJAX 通知另一台服务器 然后重新加载页面 即使页面加载失败 如何确保脚本运行 None
  • 如何在Angular中的地图上动态绘制多边形形状

    如何动态绘制多边形形状 未预定义paths 以及如何存储多边形的经纬度值 我已经参考了AGMP多边形 https angular maps com api docs agm core directives AgmPolygon html但这
  • 如何检查从 C++ 字符串到无符号整数的转换

    我需要 1 找出我当前系统上最大的 unsigned int 值是多少 我在 limit h 上没有找到它 写起来安全吗unsigned int maxUnsInt 0 1 我也尝试过unsigned int maxUnsInt MAX I
  • 捕获目录内发生的事件

    我正在使用以下方式观看目录Java 7 nio WatchService通过使用以下方法 Path myDir Paths get rootDir try WatchService watcher myDir getFileSystem n
  • 访问 Access 2013 数据库的架构

    如果我尝试读取 Access 2013 数据库的架构 我会收到以下错误 no read permission on MSysRelationships 现在帮助告诉我 User level security features are not
  • 如何将类添加到 simple_form 2 包装器中的输入组件

    我正在努力拥有class text 在我的输入字段中使用名为 hinted in simple form 2 0 0 rc 的自定义包装器时 config wrappers hinted do b b use input class gt
  • 为什么这个 TensorFlow 实现远不如 Matlab 的神经网络成功?

    作为一个玩具示例 我正在尝试拟合一个函数f x 1 x来自 100 个无噪声数据点 matlab 默认实现非常成功 均方差约为 10 10 并且插值完美 我实现了一个神经网络 其中一个隐藏层包含 10 个 S 型神经元 我是神经网络的初学者
  • NodeJS 中是否可以实现多线程?

    所以我有一个应用程序Socket IO其目的是在不同站点上搜索一些数据 像爬虫之类的东西 主要问题是搜索过程太长 当它发生时我的应用程序卡住了 例如 如果一个用户开始第二次搜索需要等到第一次完成 每个需要搜索的网站都表示为一个单独的类 因此