使用javascript

时间:2015-05-29 19:54:48

标签: javascript multithreading google-chrome process communication

问题:

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

背景

我正在编写一个大型应用程序,最近我决定尝试将整个内容迁移到浏览器。由于我的工作地点,这是Google Chrome。以前,该应用程序由基于c ++的(Qt)Web服务器/计算引擎组成,浏览器仅用于GUI。现在我已将计算引擎移动到javascript,然后在浏览器中运行它。

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

详细信息:

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

GUI通常需要从计算引擎读取~500个浮点数/秒(作为JSON发送)并回写~5个数字/秒。

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

我还阅读了一些关于ServiceWorkers和其他新API的信息,例如WebRTC。我也玩过存储API,并认为它们可能会被用来获得两个独立的进程(标签)以我需要的速率进行通信。

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

注意:我看到了一些其他类似的问题,但他们没有明确说明需要单独的流程(只有单独的标签)

1 个答案:

答案 0 :(得分:1)

好吧,看起来我已经找到了答案。问题原来是我试图打开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标签崩溃,我也可以通过引擎标签运行。