问题标签 [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.
javascript - nodejs工作线程共享内存
我正在尝试在我的应用程序中将工作线程与工作池一起使用,该应用程序旨在在 256mb docker 容器中运行。
我的主线程占用大约 30mb 的内存,1 个工作线程占用大约 25mb 的内存(考虑到第三方节点模块的需求)。考虑到这一点,我只能创建一个约 7 个工人的池。
但是我的应用程序要求是,它应该能够通过创建许多工作人员并监听一个工作(比如大约 20 个或更多)来一次处理多个工作。
有什么方法可以让我使用第三方模块(如(lodash、request 等)在工作线程之间共享,以节省在需要所有必要模块时所需的内存。
我最初的思考过程就像我可以尝试使用共享内存(SharedArrayBuffer),但它不会工作,因为它不允许传递如此复杂的对象结构和函数。
谁能帮助我什么是可能的解决方案?
提前致谢!
javascript - 共享工人在打包应用程序之前工作,但之后不工作(电子)
我有一个电子应用程序,我试图将一些 CPU 密集型任务推送到工作线程。这在我使用 启动应用程序时效果很好npm start
,但是在打包应用程序(使用带有 --asar 的电子打包器)之后,工作线程似乎停止工作。我正在加载工作线程,如下所示:
我对可能导致这种情况的原因感到非常困惑,但可能是应用程序被打包到 ASAR 文件夹中吗?我非常有信心加载工作文件的路径正确,因为我正在加载其他几个具有相同路径的图像。
node.js - 工作线程如何在 Nodejs 中工作?
Nodejs 不能像 java 和 .net 那样拥有内置的线程 API。如果添加线程,语言本身的性质就会改变。不可能将线程添加为一组新的可用类或函数。
Nodejs 10.x 添加了工作线程作为实验,现在自 12.x 起稳定。我浏览了几个博客,但可能由于缺乏知识而不太了解。它们与线程有何不同。
javascript - 如何从另一个线程向多个线程发送消息?
我有一个工作人员创建 MessageChannel 并将其中一个端口发送到主线程
第二种类型的工作人员只是接收 MessagePort 并将数据发送到端口
主线程代码
当我将一个频道发送给多个工作人员时,问题是错误的。
错误文字:DataCloneError: MessagePort in transfer list is already detached
node.js - 如何在nodejs中运行长时间运行的同步操作
我正在为我的组织在 nodejs 中编写工资管理 Web 应用程序。在许多情况下,应用程序将涉及用于计算数字的 cpu 密集型数学计算,并且许多用户也试图同时进行此操作。
如果我清楚地编写逻辑(撇开我已经从算法和数据结构的角度尽力控制复杂性这一事实不谈)它将同步运行,阻塞事件循环并使请求、响应变慢。
如何解决这种情况?异步执行此操作的可能选项是什么?我还想提一下,可以让这个计算的东西在后台运行,然后我可以选择通过状态通知告诉用户。我已经在这些地方搜索了解决方案,我找到了一些解决方案,但只是理论上的,我还没有通过实施来测试它们。下面提到:
- 集群节点服务器
- 使用工作线程
- 使用备用服务器并进行一些负载平衡。
- 使用消息队列并将其与工作线程耦合以执行后台任务。
有人可以在这种情况下给我一些久经考验的建议吗?还有一些与之相关的教程链接。
node.js - 工作线程在第一条消息后不会响应?
我正在制作一个服务器脚本,为了让主机和客户端都能更轻松地做他们想做的事,我制作了一个使用 nw.js(带有可视界面)运行的可定制服务器脚本。所述脚本是使用网络工作者制作的,因为 nw.js 在支持工作者线程方面存在问题。
现在 NW.js 解决了他们与工作线程的问题,我一直在尝试将 web 工作人员内部的所有东西移到工作线程,但是有一个问题:当主线程从第二个线程接收到答案时,稍后停止响应任何后续消息。
例如,使用 NW.js 或 Node.js 本身运行以下代码将只返回一次“pong”
如何配置工作人员,以便在收到第一条消息后继续响应它收到的任何消息?
node.js - 当工作人员发生未处理的拒绝时,worker.on('error')不起作用
worker.js
main.js
为什么不调用 main.js 上的错误处理程序,而只是打印错误。
我已经使用了这个解决方案并且有效:当发生未处理的拒绝时抛出错误,但是有没有“正确”的解决方案呢?
performance - 在 nativescript/javascript 中运行非阻塞、高性能的活动
这个问题是关于在 nativescript 中运行一个非阻塞、高性能的活动,这是通过原生 Android API 直接访问硬件从麦克风读取和保存原始音频的简单任务所需的。我相信我已经将 nativescript 框架发挥到了极致,我需要专家的帮助。
我正在 Nativescript Android 中构建一个 WAV 录音机。本机实现在此处描述(相关代码如下)。
简而言之,这可以通过从 android.media.AudioRecord 缓冲区读取音频流,然后将缓冲区写入单独线程中的文件来完成,如下所述:
原生 Android 实现
startRecording()
由按下按钮触发,并启动一个运行的新线程writeAudioDataToFile()
:
isRecording
通过设置为false
(stopRecording()
由按下按钮触发)停止录制:
如果 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 异步执行)?
谢谢