go
runtime_error
ai_generated
true
rpc 错误:code = Internal desc = grpc: 发送消息失败:流已关闭
rpc error: code = Internal desc = grpc: failed to send message: stream is already closed
ID: go/grpc-stream-already-closed
80%修复率
86%置信度
0证据数
2024-10-05首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.50+ | active | — | — | — |
根因分析
在 CloseSend 之后或流返回 io.EOF 之后调用流的 Send。常由多个 goroutine 并发调用 Send 引起。
English
Calling Send on a client or server stream after CloseSend or after the stream returned io.EOF. Often caused by concurrent Send from multiple goroutines.
解决方案
-
94% 成功率
for _, m := range msgs { if err := stream.Send(m); err != nil { if err == io.EOF { break } return err } } return stream.CloseSend() -
85% 成功率
for { stream, err := client.Push(ctx) if err != nil { return err } if err := sendAll(stream, batch); err != nil { return err } if _, err := stream.CloseAndRecv(); err != nil { return err } if done(batch) { return nil } }
无效尝试
常见但无效的做法:
-
90% 失败
gRPC streams are one-shot; CloseSend is idempotent but does not reopen the stream for sending.
-
88% 失败
Subsequent Sends return the same error; the messages are silently dropped.