GRPC流关闭连接 [英] GRPC stream close connect
本文介绍了GRPC流关闭连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
golang
上使用grpc
编写服务器句柄数据流。在收到请求后,我应该把这个流放到一个Chan
,然后一个
goroutine
处理此请求并发回。但当我在goroutine
中写回客户端时,收到rpc error: code = Unavailable desc = transport is closing
。所以我想知道我是否可以将stream
传递给Channel
,此操作是否会关闭连接?
在协议缓冲区中可识别
service AsrService {
rpc Recognize(stream RecognizeRequest) returns (stream RecognizeResponse) {}
}
以下是使用GRPC自动生成
type AsrService_RecognizeServer interface {
Send(*RecognizeResponse) error
Recv() (*RecognizeRequest, error)
grpc.ServerStream
}
此处将流放到Chan
func (s *ScheduleServer) Recognize(stream
AsrService_RecognizeServer) error {
req, err := stream.Recv() // I can use Recv here
if err == io.EOF || err != nil {
// do something
}
var asrRequest ASRRequest
asrRequest.stream = &stream //pass stream to Chan
ASRRequestChan <- &asrRequest
return nil
}
这里是一个处理CHAN的Goroutine
type ASRRequest struct {
stream AsrService_RecognizeServer
}
var ClientRequestChan = make(chan *ClientRequest, 200)
func HandlRequestChan() {
for {
select {
case r := <- ClientRequestChan:
Log.Infof("Chan get request info[%v]", r)
var rsp RecognizeResponse
rsp.Code = **
streamInter := *r.stream
err = streamInter.Send(&rsp) // I can use Send here
if err != nil {
fmt.Printf("Grpc write failed,err[%v]", err)
}
fmt.Printf("return time[%v]
",time.Now().UnixNano() / 1e6)
}
}
}
然后我得到错误RPC错误:code=unavailable desc=传输正在关闭,那么在将其传递给chan之后流是否关闭?因为如果我不使用chan,它可以成功地将结果发送给客户端。
推荐答案
我更改策略并使用sync.WaitGroup
以确保main goroutine
在stream
返回之前不会返回。我将构建一个goroutine
来处理这个stream
,main goroutine
直到child goroutine
完成才会返回。因此连接不会关闭。
var wg sync.WaitGroup
func (s *ScheduleServer) Recognize(stream pb.AsrService_RecognizeServer) error {
wg.Add(1)
go s.Recognize_Syn(&wg, stream)
wg.Wait()
return nil
}
func (s *ScheduleServer) Recognize_Syn(wg *sync.WaitGroup, stream pb.AsrService_RecognizeServer) error {
defer wg.Done()
//do something
err = stream.Send(&rsp)
return nil
}
这篇关于GRPC流关闭连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文