# rpc 错误：code = Internal，desc = grpc：服务器已停止

- **ID:** `go/grpc-server-stream-closed`
- **领域:** go
- **类别:** system_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

在调用 grpc.Server.Stop() 或 GracefulStop() 后，处理器仍尝试在流上发送。常见于关闭期间未排空进行中的处理器。

## 版本兼容性

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

## 解决方案

1. **** (95% 成功率)
   ```
   Use GracefulStop with a timeout fallback:
done := make(chan struct{})
go func() {
    grpcServer.GracefulStop()
    close(done)
}()
select {
case <-done:
case <-time.After(30 * time.Second):
    grpcServer.Stop()
}
   ```
2. **** (90% 成功率)
   ```
   Check ctx.Err() before each Send in streaming handlers:
if err := stream.Context().Err(); err != nil {
    return status.FromContextError(err).Err()
}
   ```

## 无效尝试

- **** — Restarting does not drain in-flight handlers; the error recurs on the next shutdown. (80% 失败率)
- **** — Clients receive truncated responses and may retry with stale state. (75% 失败率)
