# rpc error: code = DeadlineExceeded desc = context deadline exceeded while receiving from stream

- **ID:** `go/grpc-context-deadline-exceeded-stream`
- **Domain:** go
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

A server-streaming or bidirectional-streaming RPC exceeded the client context deadline while waiting for the next message.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| google.golang.org/grpc 1.52+ | active | — | — |

## Workarounds

1. **** (92% success)
   ```
   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% success)
   ```
   For long-lived streams, use context.Background() and implement server-side heartbeat messages; reconnect on stream error with backoff.
   ```

## Dead Ends

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