进行 go RPC 调用时,返回类型为 channel
Posted
技术标签:
【中文标题】进行 go RPC 调用时,返回类型为 channel【英文标题】:When making a go RPC call , the return type is channel 【发布时间】:2021-11-28 20:51:47 【问题描述】:首先,这是一个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、有状态的通道?
【问题讨论】:
【参考方案1】:正如您已经提到的,通道位于内存变量中,无法在其他应用程序或系统中使用它们。另一方面,gRPC 将传递和解析二进制数据,在这种情况下再次传递通道指针,只会返回服务器内存中的指针地址。客户端收到该地址后,它将尝试指向本地计算机内存中的该地址,不幸的是,这可能是任何类型的数据。
如果您想推送一组数据(比如说字符串数组),您可以使用服务器流式传输或双向流式传输。
另一方面,如果您想实现某种稳定且保持活动的连接,您也可以考虑使用 websockets。
【讨论】:
以上是关于进行 go RPC 调用时,返回类型为 channel的主要内容,如果未能解决你的问题,请参考以下文章