Electron IPC模块的更快替代方案

11
我正在编写一个Electron应用程序,需要每 ~25ms 从渲染器向在主进程中使用本地fork模块启动的单独Node进程发送相当多的数据。
这些数据看起来像这样:[{ x: int, y: int }, ...],其中包含约1000个点(为了简洁起见,还有一些更多信息)。
我开始在渲染器进程中使用ipc.send,但它会有很严重的性能损失:每个ipc.send需要4.25ms。
因此,我尝试了使用ws npm包在分叉的Node进程中启动WebSocket,并使用JSON将数据发送到WebSocket上。这个解决方案要好得多。甚至通过使用avsc而不是解析为JSON来进一步改进它(从~4ms到~1ms)。
因此,WebSocket解决方案非常好,但存在一个问题:它需要找到一个空闲端口并通过本地网络进行通信。在macOS中,这也会触发对话框:
“Do you want the application "x.app" to accept incoming network connections?”
与使用本地网络的棘手问题结合在一起的这个对话框是我想避免的。 我的问题是:是否有人知道在Electron中发送数据到其他进程的更好的解决方案,而不涉及本地网络?
1个回答

5
所以WebSocket解决方案很好,但有一个问题:它需要找到一个空闲端口并通过本地网络进行通信。在macOS中,这也会触发一个对话框:...
您是否使用了回送地址?回送地址不应该需要网络确认。在我的本地ws电子项目中,我使用127.0.0.1:port代替localhost,这完全绕过了互联网安全对话框。您可以使用其他127.x.x.x地址,只要在Linux/MacOS上添加适当的回送接口即可。在Windows上,默认已添加127.x.x.x。
我的问题是:有没有人知道一种更好的解决方案,可以将数据发送到Electron中的其他进程,而不必经过本地网络?

Electron可以使用IPC、RPC或基于网络的通信技术。您已经体验过IPC(RPC非常相似)。根据我的经验,最快的是基于网络的技术。我的经验与您类似,即WebSockets远胜其他竞争对手。除非使用LAN/WAN/ISP地址,否则基于网络的通信技术不应触发局域网/广域网/ISP安全措施。


1
澄清一下:永远不要使用计算机的网络IP或0.0.0.0(表示任何接口)。本地主机通常是可以的,但它是可欺骗的,因为它使用本地DNS查找。 - Fuzzical Logic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接