javascript - 使用 javascript 在 2 个 google chrome 进程(选项卡)之间进行通信

标签 javascript multithreading google-chrome process communication

问题:

在不使用网络服务器的情况下,在单独的 Google Chrome 渲染进程(选项卡)之间进行通信的最佳方式是什么?

背景:

我正在编写一个大型应用程序,最近我决定尝试将整个应用程序迁移到浏览器。由于我工作的地方,这是 Google Chrome。以前的应用程序由基于 C++ (Qt) 的网络服务器/计算引擎组成,浏览器仅用于 GUI。现在我已将计算引擎移至 JavaScript,并在浏览器中运行它。

问题是 GUI 稍微不稳定。它通常会保持运行大约 12 小时,但随后会因“Aw Snap”错误而崩溃。之前我并不担心,因为刷新页面很简单。现在,当 GUI 由于与计算引擎在同一进程中运行而崩溃时,它也会崩溃。

详细信息:

计算引擎现在是一个网页,可以产生许多网络 worker 。它还将 GUI(一个单独的网页)作为弹出窗口打开,并使用 PostMessage 与其进行通信。

GUI 通常需要每秒从计算引擎读取约 500 个 float (以 JSON 形式发送),并每秒写回约 5 个数字。

昨天我很兴奋,因为我发现了 SharedWorker API,我认为它可以实现我想要的功能。然而今天,我了解到最近对 Chrome 进行了修改,因此 SharedWorker 实际上在与附加选项卡相同的进程中运行,并且它实际上强制附加到它的所有选项卡进入一个进程。显然它以前不这样做。有谁知道我是否可以设置任何浏览器标志来恢复旧行为?

我还阅读了一些有关 ServiceWorkers 和其他新 API(例如 WebRTC)的内容。我还尝试过存储 API,并认为也许它们可以用于让两个单独的进程(选项卡)以我需要的速率进行通信。

我想要一个可以在本地工作的解决方案(使用 --allow-file-access-from-files 之类的开关)并且不需要安装插件(因为即使本地插件在我工作的地方也被阻止)。

注意:我看到了其他一些类似的问题,但它们没有具体解决需要单独的进程(仅单独的选项卡)

最佳答案

嗯,看来我已经找到答案了。问题出在我如何尝试打开 GUI 窗口。

我在计算引擎上有一个链接,用户单击该链接即可打开窗口:

<a href="gui.html" target="_blank">Open GUI</a>

然而事实证明,添加rel="noreferrer"会导致chrome在新进程中打开窗口。

<a href="gui.html" rel="noreferrer" target="_blank">Open GUI in new process</a>

在我弄清楚这一点之后,SharedWorker 开始按照我的预期运行,即使 GUI 选项卡崩溃,我也能够保持引擎选项卡运行。

关于javascript - 使用 javascript 在 2 个 google chrome 进程(选项卡)之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538042/

相关文章:

javascript - this.prototype 和 module.exports 之间的区别?

java - ExecutorService - 主线程关闭

java - Android 中的 HTTPRequest 线程

javascript - 使用 Javascript 选择表单中的最大选择数

javascript - 在 JavaScript 中将动态局部变量添加到全局变量

javascript - IE8 javascript 文件中出现未指定错误

javascript - Chrome 扩展 "Refused to load the script because it violates the following Content Security Policy directive"

javascript - 防止文档样式表影响chrome扩展注入(inject)的元素样式

javascript - 当用户在 KendoNumericTextbox 中键入十进制字符时显示错误

python - 两个客户端无法在套接字客户端-服务器连接中相互通信