当进行go RPC调用时,返回类型是channel



首先,这里有一个PRC服务器. 请注意其中一个返回类型是chan:

func (c *Coordinator) FetchTask() (*chan string, error) {
// ...
return &reply, nil
}

客户端进行RPC调用。通常,调用者将获得一个类型为*chan string的通道。

call("Coordinator.FecthTask", &args, &reply)
这是我的问题。如果服务器连续写入通道:
for i := 0; i < 100; i++ {
reply<- strconv.Itoa(i)
}

客户端可以持续从通道读取数据吗?

for {
var s string = <-reply
}

我猜客户端不能,因为服务器和客户端不在同一个内存中。他们通过网络交流。因此,即使变量reply是一个指针,它在服务器和客户端所指向的地址也不同。

我不确定。你觉得怎么样?非常感谢!!!!

顺便说一句,有没有办法实现REAL服务器和客户端之间的有状态通道?

正如你已经提到的,通道是内存变量,不可能在其他应用程序或系统中使用它们。另一方面,gRPC将传递和解析二进制数据,在这种情况下再次传递通道指针,将只返回服务器内存中的指针地址。在客户端接收到该地址后,它将尝试指向本地机器内存中的该地址,不幸的是,该地址可以是任何类型的数据。

如果你想推送一组数据(比如一个字符串数组),你可以使用服务器流或双向流。

另一方面,如果你想实现某种稳定和保持活跃的连接,你也可以考虑websockets。

最新更新