go - 共享内存与 Go channel 通信

标签 go ipc shared-memory channel goroutine

Go 的口号之一是 Do not communicate by sharing memory; instead, share memory by communicating .

我想知道 Go 是否允许在同一台机器上运行的两个不同的 Go 编译二进制文件相互通信(即客户端-服务器),与 C++ 中的 boost::interprocess 相比,这将有多快?到目前为止,我看到的所有示例都只是说明了同一程序例程之间的通信。

非常感谢一个简单的 Go 示例(具有单独的客户端和服务器代码)!

最佳答案

当我读到这篇文章时,我首先想到的是 Stackless Python。 Go 中的 channel 让我很多想起了 Stackless Python,但这可能是因为 (a) 我已经使用过它,以及 (b) 他们实际上采用的语言/思想我从未接触过。

我从未尝试将 channel 用作 IPC,但这可能是因为替代方案可能更安全。这是一些伪代码:

程序1

chan = channel()
ipc = IPCManager(chan, None)
send_to_other_app(ipc.underlying_method)

chan.send("Ahoy!")

程序2

chan = channel()
recv_from_other_app(underlying_method)
ipc = IPCManager(chan, underlying_method)

ahoy = chan.recv()

如果您使用传统的 IPC 方法,则可以在每一侧都有 channel ,将它们的通信封装在它之上。这会导致实现中的一些问题,我什至无法考虑如何解决这些问题,并且可能会出现一些意想不到的竞争条件。

但是,我同意;使用与 Go channel 相同的灵 active 通过进程进行通信的能力将是惊人的(但我担心不稳定)。

不过,在每一侧都使用 channel 封装一个简单的套接字可以为您带来几乎所有的好处。

关于go - 共享内存与 Go channel 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1730655/

相关文章:

python - 使用Python与minecraft服务器通信

perl - wget 不通过 IPC::Open3 与 bash 运行

Golang 包不在 GOROOT (/usr/local/go/src/packageName)

windows - go中如何连接Oracle

android - 其他进程可以看到总线事件吗?

python - 为什么 Python 中的共享值会创建额外的进程

Android原生库共享内存

linux - 检查 System V 共享内存段是否由大页面或常规页面支持

go - 包中结构的惯用 Go 名称?

go - 如何将文件嵌入到 Go 二进制文件中