首页 > 解决方案 > 如何在单个工作线程中监视对 SharedArrayBuffer 的更改?

问题描述

我可以向你保证,这不是你典型的“如何观察 JS 变量的变化”的帖子!

所以我有一些工作线程为 Node.js 中的父线程收集数据。

父线程在设定的时间范围内处理数据,只关注事物。

有时工作线程发送给父线程的数据真的很有趣,当父线程得到有趣的数据时,我希望它立即被处理。(无需等待下一个刻度滚动。)

我坚持的是如何最快速有效地与主工作线程进行通信dataIsInteresting = true

工作线程立即知道他们的数据很有趣,但主线程只知道当它处理时,它通常会在几百毫秒后滴答作响。

我正在使用SharedArrayBuffers 在工作线程和父线程之间共享内存。

令人沮丧的是,父线程实际上立即拥有有趣的数据,它就在其中,只是在计时器关闭并告诉它处理该 SharedArrayBuffer 中的数据之前它不知道它。

我知道我可以通过多种方式从工作线程向父线程发送消息,但无论我怎么做都需要大约 0.75 毫秒。(对于 JS postMessage 以及本地 Websocket 客户端/服务器设置,速度似乎相同......这是有道理的。)

这很好,但是我找到了一种更快的方式来在线程之间进行通信(至少是这样),并且只是希望可能有其他我没有想到的方式?

我可以运行在父线程中调用的同一函数的递归循环isDataInteresting(),不断地用 调用自身process.nextTick(() => {isDataInteresting();});,但这会使 CPU 最大化,我担心它会减慢需要在父线程中定期发生的其他重要计算。

我可以将其切换为setTimeout(function(){isDataInteresting();},0);每隔几千次调用调用一次,isDataInteresting()以将父线程上的 CPU 使用率降低到恒定的 25%,这是我可能要采取的路线,但这看起来很笨拙。

我不能将激进的isDataInteresting()检查传递给另一个工作线程,因为这会产生与我一开始遇到的相同的问题......这就是如何立即通知父线程有趣的数据!

不幸的是,也不允许通过 javascript postMessages 克隆/发布代理对象。

isDataInteresting()支票在很大程度上是最快的。在大约 10,000 纳秒而不是 750,000 纳秒内通知父线程感兴趣的数据。所以如果kludge是唯一有效的东西,我想我会接受它。

我希望有另一种方法来检查我没有考虑的变量的更新数据吗?

谢谢阅读!

标签: javascriptnode.jsconcurrencyworkersharedarraybuffer

解决方案


推荐阅读