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

其他格式: JSON · Markdown 中文 · English
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.

generic

解决方案

  1. 94% 成功率
    for _, m := range msgs {
        if err := stream.Send(m); err != nil {
            if err == io.EOF { break }
            return err
        }
    }
    return stream.CloseSend()
  2. 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 }
    }

无效尝试

常见但无效的做法:

  1. 90% 失败

    gRPC streams are one-shot; CloseSend is idempotent but does not reopen the stream for sending.

  2. 88% 失败

    Subsequent Sends return the same error; the messages are silently dropped.