Perhaps more helpful: in your code example, you would then consume the responses by calling Recv() on the stream until it returns an error (io.EOF on successful end of stream or some other error if the call fails). Even if you are not expecting any response data from the server, you want to call Recv() in order to learn the ultimate disposition of the call (did it result in an error in the server or was it processed successfully?).
log.Println("stream starting") streamCtx, cancel := context.WithCancel(ctx) defer cancel() stream, err := grpcStream(streamCtx, otherArgs) if err != nil { errCh <- err return } defer stream.CloseSend() defer log.Println("closing stream") for { msg, err := stream.Recv() if err == io.EOF { break } if err != nil { errCh <- err return } } ---- Josh Humphries FullStory <https://www.fullstory.com/> | Atlanta, GA Software Engineer j...@fullstory.com On Mon, Feb 6, 2017 at 10:36 AM, Josh Humphries <j...@fullstory.com> wrote: > On the client, the CloseSend method is "half-closing" the stream. So it > closes the request/upload half of the stream. The stream remains open until > the server closes the other half: the response/download part of the stream. > Cancelling the stream also closes it (as would the channel being > disconnected or the call timing out). > > > > ---- > > Josh Humphries > > FullStory <https://www.fullstory.com/> | Atlanta, GA > > Software Engineer > > j...@fullstory.com > > On Mon, Feb 6, 2017 at 10:29 AM, Michael Bond <kemperbond...@gmail.com> > wrote: > >> Hey, trying to make sure I'm doing this correctly. >> >> Right now I'm having issues with closing streams started with a context >> that is passed around and exists for quite awhile. >> >> In this example "ctx" is passed around to many go routines, I want to >> keep "ctx" around but passing it to "grpcStream" seems to keep the stream >> from actually closing. What I did below fixed the issue but I wanted to >> know if it is needed to pass a child context and cancel it for the stream >> to actually close. Is CloseSend() not sufficient if the context is still >> alive? >> >> log.Println("stream starting") >> streamCtx, cancel := context.WithCancel(ctx) >> defer cancel() >> stream, err := grpcStream(streamCtx, otherArgs) >> if err != nil { >> errCh <- err >> return >> } >> defer stream.CloseSend() >> defer log.Println("closing stream") >> >> Thanks! >> >> -- >> You received this message because you are subscribed to the Google Groups >> "grpc.io" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to grpc-io+unsubscr...@googlegroups.com. >> To post to this group, send email to grpc-io@googlegroups.com. >> Visit this group at https://groups.google.com/group/grpc-io. >> To view this discussion on the web visit https://groups.google.com/d/ms >> gid/grpc-io/85470940-69e3-4f4c-aed2-31a3242841a3%40googlegroups.com >> <https://groups.google.com/d/msgid/grpc-io/85470940-69e3-4f4c-aed2-31a3242841a3%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to grpc-io+unsubscr...@googlegroups.com. To post to this group, send email to grpc-io@googlegroups.com. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/CAO78j%2B%2BBTGmH-yEe%3D0nP5gKCv9G9ZezY_Rap3%2BTRDPS0pyxuXQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.