共享内存 vs. Go通道通信

24

Go的口号之一是不要通过共享内存来通信,而是通过通信来共享内存

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

能否提供一个简单的Go示例(包括独立的客户端和服务器代码)?谢谢!

3个回答

7

当我看到这篇文章时,我首先想到了Stackless Python。 Go中的通道让我非常想起Stackless Python,但这可能是因为(a)我用过它并且(b)它们实际上来自哪个语言/思想我从未接触过。

我从未尝试使用通道作为IPC,但这可能是因为另一种选择很可能更安全。以下是伪代码:

program1

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方法,您可以在每一侧设置通道来包装它们的通信。这会导致一些实施问题,我甚至不知道如何解决,可能还有一些意外的竞态条件。
然而,我同意;能够通过进程使用与Go通道相同的灵活性进行通信将是惊人的(但我担心不稳定)。
但是,在每一侧使用通道包装简单套接字几乎可以带来所有好处。

3

Rob表示,他们正在深入思考如何使通道作为网络透明的RPC工作,目前这还没有实现,但显然他们想花时间把它做好。

与此同时,您可以使用gob包,虽然不是完美无缝的解决方案,但已经运行得相当不错了。


2
我看过将MPI库包装的类似事情。我的目前想法是使用类似以下的东西:
func SendHandler(comm Comm){
    // Look for sends to a process
    for {
        i := <-comm.To;
        comm.Send(i,dest);  
    }
}
func ReceiveHandler(comm Comm){
    // Look for recieves from a process
    // Ping the handler to read out
    for {
        _ = <-comm.From;
        i := comm.Recv(source);
        comm.From <- i;
     }
}

在这里,comm.Send 和 comm.Recv 包装了一个 C 通信库。但我不确定如何为两个不同的程序建立通道,我没有经验处理这种情况。


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