GRPC流关闭连接 [英] GRPC stream close connect

查看:18
本文介绍了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 goroutinestream返回之前不会返回。我将构建一个goroutine来处理这个streammain 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆