问题标签 [node-worker-threads]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
31 浏览

node.js - 一些nodeJS工作线程在运行所有代码之前就结束了

我编写的脚本有一个问题,该脚本用于比较两个非常长的列表,我正在使用节点工作线程来加快速度,问题是我无法让工作人员正确完成。

这是我的工人代码。

现在的问题是,如果我process.exit()在代码中留下一些工作线程不会完成他们被杀死的代码。一些线程确实设法输出了console.log("Worker "+ workerFirst +"-"+workerLast+" finished @ " + new Date());一些没有,并且没有一个线程设法输出,console.log(newRecord);但代码将完成,然后将继续工作程序生成文件中的代码。如果我省略了 process.exit() 工作人员工作正常,我会看到所有 console.logs 但代码将永远不会结束,我必须手动终止脚本(ctrl+ C)。

任何人都可以看到发生这种情况的明显原因吗?

0 投票
1 回答
324 浏览

node.js - NodeJS 工作线程和 AWS Lambda:输出不一致

我正在尝试执行以下 AWS lambda:

index.js:

测试.js:

工人.js:

当我在笔记本电脑上运行相同的程序时,它运行良好。我一直看到工作线程的输出。

我的笔记本电脑上的输出:

lambda 上的输出:

当我运行 lambda 时,输出非常随机。有时我会看到工作线程的输出,有时我看不到。

为什么程序在 AWS lambda 和我的笔记本电脑上的执行存在差异?

0 投票
1 回答
355 浏览

javascript - 如何在工作线程之间共享上下文

我想在 node.js 应用程序中创建一个工作线程并将当前上下文传递给新线程,这样我就可以在新线程中访问我的变量和函数,是否有支持它的库?如果不能,我至少可以在它们之间传递一个匿名函数吗?

0 投票
1 回答
19 浏览

node.js - NodeJS 中的 REST API 并行 bash 命令

我想用 NodeJS 创建一个 Express 服务器,其中一个端点需要执行繁重的 bash 操作。但是这样做会疯狂地减慢整个服务器的速度!例如,我创建了一个端点,它只在后台/ping执行命令并返回结果。ping 8.8.8.8

如果我向服务器启动 2 个并行请求,它们会相互阻塞并一个接一个地执行:

阻塞请求

我尝试使用工作线程,但无法完成。这在 NodeJS 中是否可行?如果不是......我怎么能做到这一点?

0 投票
0 回答
107 浏览

node.js - NodeJS nodejavabridge 在工作线程中初始化时抛出错误

为了同时执行多条SQL语句,多线程以worker_threads的形式实现。应用程序本身使用 node-jdbc 库 ( https://github.com/CraZySacX/node-jdbc ) 通过数据库的 JDBC 接口查询数据。

注意:该项目是用打字稿编写的。

版本:

  • 节点:12.18.1

  • 打字稿:3.6.4

  • 数据库:0.7.5

当我尝试在子进程中通过 require 导入 JDBC 库时发生错误。主进程中的 require 执行没有问题。

解决方案尝试:

如果有人可以帮助我,那就太好了。

0 投票
1 回答
223 浏览

node.js - 如何将 worker_thread 依赖项与 webpack 捆绑

我正在编写一个使用电子锻造进行设置和配置的电子应用程序。该项目使用 Webpack 5 作为打包工具,使用 typescript 作为开发语言。我在主线程上运行 worker_thread 时遇到问题。

只要 worker_thread 不使用任何导入的本地模块,一切都可以正常工作。但是当我导入模块时找不到它们。我认为这是因为 webpack 没有捆绑来自工作人员的依赖项。

我的代码如下所示:

index.ts(电子主线程):

export.worker.js(与 main.ts 相同的文件夹):

当我尝试运行它时,我得到:

所以我想知道:如何在我的项目中使用引用模块的worker_threads?

0 投票
1 回答
35 浏览

javascript - 如何在 nodejs 中使用 wroker 线程让代码执行得更快?

我有一个 js 文件,其中包含多个函数,可以导出到其他 js 文件,然后我执行一些任务。但问题是有些功能需要花费大量时间,例如有一个功能可以重命名文件系统上的数千个文件,从而完全阻塞电子 UI 30 秒。这是我的文件的样子:

我是nodejs 工作线程的新手,需要帮助。或者除了工作线程还有其他解决方案吗?

0 投票
0 回答
27 浏览

node.js - 工作线程中的nodejs垃圾收集似乎与主线程中的执行方式不同

我在 nodejs 中使用了一些图像处理库,比如jimpsharp,我想把它们放在一个工作线程中,因为它们是 cpu 密集型的。然而,在大型图像上使用这些工具时,nodejs 工作线程似乎从不进行垃圾收集。

我已经能够通过对大型源文件的所有操作中最简单的操作来重现该问题,即使用 fs read 将它们读入缓冲区。

下面的代码片段显示,当bigFileTest()在 worker 中执行时,rss 的大小不断增加,但在主线程中执行时会进行垃圾收集。

已尝试以下操作:

  • global.gc()使用With node 选项强制垃圾收集启动--expose-gc没有区别。
  • 为 gc 提供时间来执行它的功能await new Promise(resolve => setTimeout(resolve, 3000));并没有什么区别。
  • 设置最大旧空间的限制没有区别--max-old-space-size=1024
  • 将变量显式设置fileBuffer为 null 没有区别

下面的示例从 wikipedia 获取一个大文件,然后在 service worker 的循环中将其加载到内存中 10 次。每次迭代时,使用的内存都会随着文件大小的增加而增加。

但是,如果执行示例从主线程调用测试,则使用的内存不会增加。

有没有办法在线程内触发垃圾收集。难道我做错了什么?

结果

在工人中执行时

请注意,rss 的大小不断增加,大约是正在加载的文件的大小。但是,heapTotal 和 heapUsed 似乎没有增加。

在 main 中执行时

0 投票
1 回答
97 浏览

node.js - 当有一些节点实例时,如何正确处理 worker_threads 终止?(如 docker-swarm 或 Kubernetes 集群)

我正在节点中创建worker_threads,并将它们收集到自定义WorkerPool。所有的工人都是独一无二的,因为他们有唯一的worker.threadId。我的应用程序能够终止特定的工作人员——我在 WorkerPool 中有 terminateById() 方法。

因此,如果您有一个 node.js 实例——一切都很好。但是,如果您尝试使用 docker-swarm 或 Kubernetes——您将拥有 n 个不同的 WorkerPool 实例。因此,例如,您在一个节点实例中创建了一些工作人员,现在您正试图终止一个 - 这意味着您有一些带有 threadId 的请求(或其他唯一数据来识别工作人员)。例如,您的负载均衡器选择为此请求使用另一个节点实例,在这种情况下您没有工作人员。

起初我想,我可以将 worker 的唯一索引更改为 userId+ThreadId 之类的东西,然后将其存储在 redis 中。但后来我没有找到任何关于 Worker.findByThreadID() 之类的信息。那么,当您有多个节点实例时,我该怎么办?

更新: 我在负载均衡器中找到了一些关于粘性会话的信息。这意味着,使用 cookie 我们可以将特定用户粘贴到特定节点实例,但在我的情况下,这种粘性必须处于活动状态,直到 worker 终止。它可以持续几天

0 投票
0 回答
90 浏览

node.js - Node.js 工作者资源限制是如何工作的?

在这里,在 Node.js 的工作线程文档中,它指的是这些术语。我正在寻找关于这些属性中的每一个以及它们如何工作的简单解释。

我遇到的问题与高计算场景有关,我试图在 Google Compute Engine 上具有 128 个 cpu 内核和 512GB 内存的系统上处理大量数据。Worker 目前仅在 16 核和 96GB 内存下无错误地执行。无论我使用的是哪个工作线程库,从 32 核及以上我都会收到此错误:

范围错误

避免此错误的最佳设置可能是什么?这似乎不是一个流行的场景,所以到目前为止我在搜索中还没有找到任何有用的信息。