22

One of Go's slogans is Do not communicate by sharing memory; instead, share memory by communicating.

I am wondering whether Go allows two different Go-compiled binaries running on the same machine to communicate with one another (i.e. client-server), and how fast that would be in comparison to boost::interprocess in C++? All the examples I've seen so far only illustrate communication between same-program routines.

A simple Go example (with separate client and sever code) would be much appreciated!

4

3 回答 3

7

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

我从未尝试将通道用作 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 方法,则可以在每一侧都有通道,将它们的通信包装在它之上。这会导致实现中的一些问题,我什至无法考虑如何解决这些问题,并且可能会出现一些意想不到的竞争条件。

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

然而,在每一侧都用通道包裹一个简单的套接字可以为您带来几乎所有的好处。

于 2009-11-13T17:27:07.737 回答
3

Rob 说过,他们正在考虑如何让通道作为(网络)透明 RPC 工作,目前这行不通,但显然这是他们想要花时间把它做好的事情

与此同时,您可以使用gob 包,它虽然不是一个完美和无缝的解决方案,但已经很好地工作了。

于 2009-11-14T13:59:30.327 回答
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 包装交流通信库。不过,我不确定您如何为两个不同的节目设置频道,我在这种事情上没有经验。

于 2009-11-13T21:24:57.343 回答