# 已取消: grpc: 客户端侧流被客户端中止

- **ID:** `grpc/grpc-client-side-stream-abort`
- **领域:** grpc
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 85%

## 根因

客户端在服务器完成处理之前显式关闭或取消了流，通常是由于过早的上下文取消或 stream.CloseSend() 的误用。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| grpc-go 1.62.0 | active | — | — |
| grpc-python 1.60.0 | active | — | — |
| grpc-node 1.10.0 | active | — | — |

## 解决方案

1. ```
   Ensure the client does not call stream.CloseSend() before receiving all server responses. In gRPC-Go, use a proper pattern:
  stream, err := client.StreamingMethod(ctx)
  // Send all messages
  stream.CloseSend()
  // Then receive all responses
  for {
      resp, err := stream.Recv()
      if err == io.EOF { break }
  }
   ```
2. ```
   Add a defer cancel() after creating the context to ensure proper cleanup without premature cancellation:
  ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  defer cancel()
  stream, _ := client.StreamingMethod(ctx)
  // Use stream
  // cancel() will be called when function returns, not before stream completes
   ```

## 无效尝试

- **** — The error is caused by explicit cancellation or stream abort, not timeout; extending timeout doesn't prevent premature CloseSend(). (80% 失败率)
- **** — The stream is already closed; server cannot send responses, leading to resource leaks and inconsistent state. (95% 失败率)
