在Web-Worker中同步等待消息

2024-02-12

是否有某种方法可以同步等待或检查网络工作人员中的新消息?

我有一大堆复杂的代码(从 emscripten 编译的 LLVM),我无法围绕回调进行重构。

我需要确保在收到并处理来自 UI 线程的消息之前,特定行之后的代码不会执行。如果我用 while 循环阻塞,则事件循环永远不会运行,因此我无法接收消息。


这是我在工作中也遇到的问题Pyodide https://github.com/pyodide/pyodide。我想从主线程“同步”调用一个函数。

一种解决方案涉及Atomics and SharedArrayBuffer蜜蜂。从网络工作者的角度来看,这看起来像下面这样

  1. postMessage主线程
  2. 冻结我们自己Atomics.wait
  3. 被主线程解冻
  4. 读取结果SharedArrayBuffer。我们无法收到结果postMessage,因为没有同步方式询问“我收到消息了吗”。

当然,这需要大量的额外代码来处理所有序列化、数据传递等。

主要限制是要使用这些 API,需要具备COOP/COEP 标头集 https://dev.to/stefnotch/enabling-coop-coep-without-touching-the-server-2d3n。另一件需要记住的事情是,这仅适用于最新的浏览器,例如 Safari 15.2(于 2021 年 12 月发布)。

还有一个替代解决方案同步 XHR 和 Service Worker https://glitch.com/edit/#!/sleep-sw?path=worker.js%3A28%3A71,但我还没有研究过这个选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Web-Worker中同步等待消息 的相关文章

随机推荐

  • 计算小距离用什么公式

    Hy 我需要计算 2 个 GPS 点之间的距离 我读了这个问题计算地理邻近度的公式 https stackoverflow com questions 2096385 formulas to calculate geo proximity但
  • 更改 MouseOver 上的 MenuItem 的颜色

    我想在鼠标悬停时更改菜单项的颜色 我还需要圆形边框 图像和文本框 当我设置样式时 一切正常 只有 mouseOverEvent 正在执行任何操作 背景不会改变 我的代码是
  • 绕圆形路径移动一个点[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个带有二维坐标的点 我需要更改点坐标值才能遵循圆形路径 我将如何使用 C 实现它 使用正弦和余弦 for double t 0
  • 有没有办法让字典作为 python 中 pandas Dataframe 的条目?

    就像是 d a 1 b 2 data pandas DataFrame data new column d data new column 0 最后一个命令将返回字典 d 您可以将字典包装在列表中 以便将字典视为元素而不是可迭代对象 d a
  • C++ 向量元素计数

    在C 中 使用向量头 如何找到元素的数量 include
  • 是否可以修复长 html huxtable 的头部?

    这适用于使用以下命令生成的表kableExtra这在检查长桌子时很有用 我想知道是否有人知道如何做到这一点huxtable 这是一个示例 Rmd 以了解我的意思 我希望在向下滚动时将 huxtable 标题固定在页面顶部 就像在 kable
  • 短路和一元运算符的工作

    请看一下下面的代码 int i 5 boolean b i lt 5 i lt 5 line 2 System out println i line 3 prints 5 在第2行 根据我的理解 因为在所有运算符中 具有最高优先级 i应首先
  • C++ 中的内存管理模式

    我认为我对正常 功能 设计模式有丰富的经验 例如所描述的在四人帮的书 http www amazon co uk Design patterns elements reusable object oriented dp 0201633612
  • 一段时间后重新连接到 QueueManager 时,在 MQ 客户端 (C#) 上收到错误原因代码 2059

    一段时间后我无法重新连接到 MQQueueManager 作为异常 原因代码2059 当我构造 MQQueueManager 的新对象时 抛出 MQRC Q MGR NOT AVAILABLE 我的客户端应用程序是用 NET C 编写的 我
  • FirstOrDefault 行为直接在 LINQ 语句中

    似乎我可能错过了语法中的一些简单内容 但我想直接从 linq 语句获取 FirstOrDefault 的结果 而不必先将 IEnumerable 存储在临时变量中 像这样的事情 var bestCar from c in cars orde
  • 如何制作类型提示前向引用[重复]

    这个问题在这里已经有答案了 我正在研究 python 的 3 5 类型提示 我想知道如何键入提示类方法的返回类型 这就是我的想法 gt gt gt class A classmethod def a cls gt A pass Traceb
  • 引用分配是线程安全的吗?

    我正在 C 中构建一个多线程缓存 它将保存 Car 对象的列表 public static IList
  • 将 apply 的管道输出传送到 centos 中的记录

    我正在尝试自动化 websocket 客户端的一些测试 该客户端根据命令连接到服务器 该服务器基本上是一个语音到文本引擎 客户端支持来自麦克风的音频流 这样人们就可以实时录制自己的声音并将其传输到引擎 我在 centos 虚拟机中运行客户端
  • 如何改变drawAtPoint中NSString的颜色

    我这里有一段代码 它绘制了一个带有单字符字符串的块 CGContextDrawImage context CGRectMake blok getLocation x xunit blok getLocation y yunit 40 40
  • 在 python setup.py data_files 中包含整个目录

    设置的 data files 参数采用以下格式的输入 setup data files target directory list of files to be put there 有没有办法让我指定整个数据目录 这样我就不必单独命名每个文
  • 模糊测试 XML 解析器

    我想对 XML 解析器进行模糊测试 并想知道是否有一些合适的模糊器 如果不仅能生成随机垃圾 还能利用 XSD 或 DTD 等现有模式规范 那就太好了 以下是我在几个月前的搜索过程中偶然发现的一些 XML 模糊器 untidy http so
  • 在 JEditorPane 中突出显示一个单词

    我必须突出显示某个单词在JEditorPane 为此 我使用以下代码 try javax swing text DefaultHighlighter DefaultHighlightPainter highlightPainter new
  • 是否可以通过用户操作或手动管理的触发器来解决 Promise?是的,所以我们能够形成可编辑的承诺

    我希望程序在完成某些用户操作后运行一系列操作 然而 链的一部分将需要等待先前 Promise 的解决或用户已执行某些操作的事实 Promise 可以这样工作吗 我想象理想的程序脚本是这样的 var coreTrigger Promise a
  • C# 中的日期和时间转换 - DateTime.ParseExact() 未按预期工作

    我有日期 时间格式 例如 2013 年 3 月 1 日 92230 根据这个文件 http msdn microsoft com en us library 8kb3ddd4 aspx and 这个链接 http www geekzilla
  • 在Web-Worker中同步等待消息

    是否有某种方法可以同步等待或检查网络工作人员中的新消息 我有一大堆复杂的代码 从 emscripten 编译的 LLVM 我无法围绕回调进行重构 我需要确保在收到并处理来自 UI 线程的消息之前 特定行之后的代码不会执行 如果我用 whil