首先,这里有一个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。