虽然我知道 JavaScript 本质上是单线程的,并且通常不赞成此类事情,但我想知道是否有任何方法可以让 WebWorker 等待主线程提供一些数据,而不会破坏 WebWorker 的调用堆栈。
由于这是一个有趣的项目,我可以使用无法在旧浏览器上可靠运行的新技术和东西,只要它们有效,我不介意深奥的黑客攻击。
我考虑过的其他一些解决方案:
在循环中不断轮询LocalStorage,直到在预定的key处有数据。这似乎可行,因为即使在循环中轮询时,其他线程的 LocalStorage 更新也应该对当前线程可见,从所有关于 LocalStorage 的线程安全性的讨论以及多个选项卡写入同一个 LocalStorage 键的情况来看。这种方法的缺点是它不是真正的“等待”,即工作线程仍然在 LocalStorage 上消耗全部 CPU 使用率。虽然 LocalStorage 通常使用锁来实现,但不可能长时间持有 LocalStorage 锁(锁被释放一次
getItem
或setItem
返回)。ECMA 脚本 6
yield
。这在这里不起作用,因为它要求调用堆栈中的所有函数(直到您想要屈服的地方)都被标记为生成器函数。我想暂停我的 WebWorker 的地方有一个调用堆栈,其中包含 WebAssembly 函数,不能将其标记为生成器函数。索引数据库。这不起作用,因为 IndexedDB 不支持同步请求。
我知道这个类似的问题,但是这个问题专门讨论了这个onmessage
事件,并且在 2012 年被问到,在yield
WebAssembly 被引入之前。
有没有办法以某种方式模拟 WebWorker 线程上的锁定,或者以其他方式,以便它会等到一些数据可用?