javascript - 如何在单个工作线程中监视对 SharedArrayBuffer 的更改?
问题描述
我可以向你保证,这不是你典型的“如何观察 JS 变量的变化”的帖子!
所以我有一些工作线程为 Node.js 中的父线程收集数据。
父线程在设定的时间范围内处理数据,只关注事物。
有时工作线程发送给父线程的数据真的很有趣,当父线程得到有趣的数据时,我希望它立即被处理。(无需等待下一个刻度滚动。)
我坚持的是如何最快速有效地与主工作线程进行通信dataIsInteresting = true
。
工作线程立即知道他们的数据很有趣,但主线程只知道当它处理时,它通常会在几百毫秒后滴答作响。
我正在使用SharedArrayBuffer
s 在工作线程和父线程之间共享内存。
令人沮丧的是,父线程实际上立即拥有有趣的数据,它就在其中,只是在计时器关闭并告诉它处理该 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是唯一有效的东西,我想我会接受它。
我希望有另一种方法来检查我没有考虑的变量的更新数据吗?
谢谢阅读!
解决方案
推荐阅读
- python - 为什么 python3 ttk 复选框使用的任何选项都会出错?
- angular - 输入中的自动完成建议为光标后的灰色字母,而不是选择弹出窗口
- javascript - 对按键作出反应,只执行一次 setTimeout
- c++ - 用 CRTP 实例化和注册派生类的最佳方法?
- neo4j - 使用 apoc.load.jdbc() 时无法在 conf/neo4j.conf 中为数据库连接字符串起别名
- python - Python Scapy无线扫描并匹配存储在文本文件中的mac地址
- c++ - 有没有办法阻止编译器将 constexpr 函数放入目标文件中?
- amazon-web-services - 无服务器:根目录下的配置错误:无法识别的属性“stepFunctions”
- javascript - 函数包装器返回函数而不是实际对象
- javascript - React setState 没有更新状态