我有一个基本的HTTP服务器,可以接受请求并从数据存储中返回数据。
每个HTTP请求都会执行以下操作:
- 创建超时上下文
- 创建读取请求(自定义类型)
- 将读取请求推送到通道中
- 等待响应并提供数据
以下是基本伪代码:
package main
import (
"context"
"net/http"
"time"
)
type dataRequest struct {
data chan string
ctx context.Context
}
func handler(reqStream chan dataRequest) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
defer cancel()
req := dataRequest{
data: make(chan string),
ctx: ctx,
}
select {
case reqStream <- req:
// request pushed to que
case <-ctx.Done():
// don't push onto reqStream if ctx done
}
select {
case <-ctx.Done():
// don't try and serve content if ctx done
case data := <-req.data:
// return data to client
}
}
}
func main() {
dataReqs := make(chan dataRequest)
go func() {
for {
select {
case req := <-dataReqs:
select {
case <-req.ctx.Done():
// don't push onto data channel if ctx done
case req.data <- "some data":
// get data from store
}
}
}
}()
http.HandleFunc("/", handler(dataReqs))
http.ListenAndServe(":8080", nil)
}
我的问题是,由于截止日期超过或客户取消请求,上下文可能随时结束,那么我目前的处理方法在多个地方处理是否正确,还是有更加优雅的解决方案?