问题标签 [worker-thread]

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 回答
1053 浏览

javascript - nodejs工作线程共享内存

我正在尝试在我的应用程序中将工作线程与工作池一起使用,该应用程序旨在在 256mb docker 容器中运行。

我的主线程占用大约 30mb 的内存,1 个工作线程占用大约 25mb 的内存(考虑到第三方节点模块的需求)。考虑到这一点,我只能创建一个约 7 个工人的池。

但是我的应用程序要求是,它应该能够通过创建许多工作人员并监听一个工作(比如大约 20 个或更多)来一次处理多个工作。

有什么方法可以让我使用第三方模块(如(lodash、request 等)在工作线程之间共享,以节省在需要所有必要模块时所需的内存。

我最初的思考过程就像我可以尝试使用共享内存(SharedArrayBuffer),但它不会工作,因为它不允许传递如此复杂的对象结构和函数。

谁能帮助我什么是可能的解决方案?

提前致谢!

0 投票
2 回答
758 浏览

javascript - 共享工人在打包应用程序之前工作,但之后不工作(电子)

我有一个电子应用程序,我试图将一些 CPU 密集型任务推送到工作线程。这在我使用 启动应用程序时效果很好npm start,但是在打包应用程序(使用带有 --asar 的电子打包器)之后,工作线程似乎停止工作。我正在加载工作线程,如下所示:

我对可能导致这种情况的原因感到非常困惑,但可能是应用程序被打包到 ASAR 文件夹中吗?我非常有信心加载工作文件的路径正确,因为我正在加载其他几个具有相同路径的图像。

0 投票
1 回答
1266 浏览

node.js - 工作线程如何在 Nodejs 中工作?

Nodejs 不能像 java 和 .net 那样拥有内置的线程 API。如果添加线程,语言本身的性质就会改变。不可能将线程添加为一组新的可用类或函数。

Nodejs 10.x 添加了工作线程作为实验,现在自 12.x 起稳定。我浏览了几个博客,但可能由于缺乏知识而不太了解。它们与线程有何不同。

0 投票
1 回答
357 浏览

javascript - 如何从另一个线程向多个线程发送消息?

我有一个工作人员创建 MessageChannel 并将其中一个端口发送到主线程

第二种类型的工作人员只是接收 MessagePort 并将数据发送到端口

主线程代码

当我将一个频道发送给多个工作人员时,问题是错误的。

错误文字:DataCloneError: MessagePort in transfer list is already detached

0 投票
0 回答
705 浏览

electron - 在电子中使用工作线程

我想在我的电子应用程序中使用工作线程。在我的开发人员环境中它可以工作,但是在使用 electron-builder 构建应用程序后,包含工作线程代码的 javascript 文件无法由 Worker 类加载。

看来,Worker 类无法从 asar 文件中加载 js。

错误弹出

在我关闭 asar 包装后,它就可以工作了(但不建议使用没有 asar 包装,所以这对我来说不是一个可接受的解决方案)。

有一个最小的例子来重现这个问题。

版本:

我有什么问题吗?有什么办法可以解决这个问题吗?

0 投票
1 回答
110 浏览

node.js - 如何在nodejs中运行长时间运行的同步操作

我正在为我的组织在 nodejs 中编写工资管理 Web 应用程序。在许多情况下,应用程序将涉及用于计算数字的 cpu 密集型数学计算,并且许多用户也试图同时进行此操作。

如果我清楚地编写逻辑(撇开我已经从算法和数据结构的角度尽力控制复杂性这一事实不谈)它将同步运行,阻塞事件循环并使请求、响应变慢。

如何解决这种情况?异步执行此操作的可能选项是什么?我还想提一下,可以让这个计算的东西在后台运行,然后我可以选择通过状态通知告诉用户。我已经在这些地方搜索了解决方案,我找到了一些解决方案,但只是理论上的,我还没有通过实施来测试它们。下面提到:

  1. 集群节点服务器
  2. 使用工作线程
  3. 使用备用服务器并进行一些负载平衡。
  4. 使用消息队列并将其与工作线程耦合以执行后台任务。

有人可以在这种情况下给我一些久经考验的建议吗?还有一些与之相关的教程链接。

0 投票
1 回答
492 浏览

node.js - 工作线程在第一条消息后不会响应?

我正在制作一个服务器脚本,为了让主机和客户端都能更轻松地做他们想做的事,我制作了一个使用 nw.js(带有可视界面)运行的可定制服务器脚本。所述脚本是使用网络工作者制作的,因为 nw.js 在支持工作者线程方面存在问题。

现在 NW.js 解决了他们与工作线程的问题,我一直在尝试将 web 工作人员内部的所有东西移到工作线程,但是有一个问题:当主线程从第二个线程接收到答案时,稍后停止响应任何后续消息。

例如,使用 NW.js 或 Node.js 本身运行以下代码将只返回一次“pong”

如何配置工作人员,以便在收到第一条消息后继续响应它收到的任何消息?

0 投票
1 回答
335 浏览

javascript - 使用 worker_threads 处理多维数组

我有一个有趣的任务,但我什至对学习工人感到困惑。有一个 10-30K 对象的维度数组。我想在可用流的数量和每个子数组中将其分解为子数组,以实现在某些字段中搜索所需对象的功能。

对于将数组划分为子数组和搜索功能的实现的问题 - 一切都很好。但是如何在每个子数组中同时在工作人员的帮助下开始搜索 - 有麻烦(

我刚开始熟悉工人,并没有完全了解一切。我将不胜感激您的帮助或建议。

PS 执行代码我得到一个错误

在此处输入图像描述

0 投票
0 回答
1234 浏览

node.js - 当工作人员发生未处理的拒绝时,worker.on('error')不起作用

worker.js

main.js

为什么不调用 main.js 上的错误处理程序,而只是打印错误。

我已经使用了这个解决方案并且有效:当发生未处理的拒绝时抛出错误,但是有没有“正确”的解决方案呢?

0 投票
1 回答
104 浏览

performance - 在 nativescript/javascript 中运行非阻塞、高性能的活动

这个问题是关于在 nativescript 中运行一个非阻塞、高性能的活动,这是通过原生 Android API 直接访问硬件从麦克风读取和保存原始音频的简单任务所需的。我相信我已经将 nativescript 框架发挥到了极致,我需要专家的帮助。

我正在 Nativescript Android 中构建一个 WAV 录音机。本机实现在此处描述(相关代码如下)。

简而言之,这可以通过从 android.media.AudioRecord 缓冲区读取音频流,然后将缓冲区写入单独线程中的文件来完成,如下所述:

原生 Android 实现

startRecording()由按下按钮触发,并启动一个运行的新线程writeAudioDataToFile()

isRecording通过设置为falsestopRecording()由按下按钮触发)停止录制:

如果 isRecording = false,则停止读取和保存缓冲区:

我的Nativescript javascript 实现:

我编写了一个与上面的原生 Android 代码相同的 nativescript 打字稿代码。我面临的问题 #1 是我无法运行while(isRecording),因为 javascript 线程将忙于在while循环内运行,并且永远无法捕获按钮点击运行stopRecording()

我试图通过使用setInterval异步执行来解决问题 #1,如下所示:

startRecording()由按下按钮触发,并设置执行的时间间隔为 10 毫秒writeAudioDataToFile()

writeAudioDataToFile()回调每 10 毫秒排队一次:

通过清除时间间隔(stopRecording()由按下按钮触发)停止录制:

问题 2:虽然这很好用,但在许多情况下,它会使 UI 冻结 1-10 秒(例如在单击按钮停止录制后)。

我尝试将执行的时间间隔writeAudioDataToFile()从 10 毫秒更改为 0 毫秒,再到 1000 毫秒(虽然缓冲区很大),但是 UI 冻结时间更长,并且我在保存的数据中遇到了丢失(未保存的缓冲数据到文件)。

我尝试通过使用此处描述的 nativescript 工作线程将此操作卸载到单独的线程,其中startRecording()stopRecording()由发送到线程的消息调用,如下所示:

这解决了 UI 问题,但产生了问题 #3:记录器停止未按时执行(即在工作线程接收到 'stopRecording' msg.data 后 10 到 50 秒停止记录)。我尝试在setInterval工作线程内部使用不同的时间间隔(0ms 到 1000ms),但这并没有解决问题,甚至导致stopRecording()执行延迟更大。

有谁知道如何在 nativescript/javascript 中执行这种非阻塞的高性能记录活动?有没有更好的方法来解决我上面描述的问题 #1(javascript 异步执行)?

谢谢