# rpc 错误：code = DeadlineExceeded，desc = 从流接收时上下文截止时间已超过

- **ID:** `go/grpc-context-deadline-exceeded-stream`
- **领域:** go
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

服务端流式或双向流式 RPC 在等待下一条消息时超过了客户端上下文截止时间。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| google.golang.org/grpc 1.52+ | active | — | — |

## 解决方案

1. **** (92% 成功率)
   ```
   Loop correctly and check ctx:
for {
  msg, err := stream.Recv()
  if err == io.EOF { break }
  if err != nil {
    if errors.Is(err, context.DeadlineExceeded) { /* re-dial */ }
    return err
  }
  handle(msg)
}
   ```
2. **** (88% 成功率)
   ```
   For long-lived streams, use context.Background() and implement server-side heartbeat messages; reconnect on stream error with backoff.
   ```

## 无效尝试

- **** — Recv returns io.EOF or error; ignoring it loops forever on a dead stream. (90% 失败率)
- **** — Long-lived streams (e.g., subscriptions) should use context.Background() plus server-driven heartbeats, not a fixed deadline. (70% 失败率)
