我正在尝试构建一个简单的Golang/Appengine应用程序,它使用通道来处理每个http请求。原因是我希望每个请求执行一个相当大的内存计算,并且每个请求以线程安全的方式执行非常重要(即来自并发请求的计算不会混合)。
本质上,我需要一个同步队列,它只会一次处理一个请求,而通道看起来很自然地适合这个任务。 Go的缓冲通道是否可以用作线程安全队列? 但是,我无法使我的简单的hello world示例工作。它似乎在'go process(w, cr)'这一行失败了;我从服务器收到200响应,但没有内容。如果我从这行中删除'go',则可以正常工作,但是我猜测我没有正确调用通道。
有人能指出我做错了什么吗?
谢谢!
本质上,我需要一个同步队列,它只会一次处理一个请求,而通道看起来很自然地适合这个任务。 Go的缓冲通道是否可以用作线程安全队列? 但是,我无法使我的简单的hello world示例工作。它似乎在'go process(w, cr)'这一行失败了;我从服务器收到200响应,但没有内容。如果我从这行中删除'go',则可以正常工作,但是我猜测我没有正确调用通道。
有人能指出我做错了什么吗?
谢谢!
// curl -X POST "http://localhost:8080/add" -d "{\"A\":1, \"B\":2}"
package hello
import (
"encoding/json"
"net/http"
)
type MyStruct struct {
A, B, Total int64
}
func (s *MyStruct) add() {
s.Total = s.A + s.B
}
func process(w http.ResponseWriter, cr chan *http.Request) {
r := <- cr
var s MyStruct
json.NewDecoder(r.Body).Decode(&s)
s.add()
json.NewEncoder(w).Encode(s)
}
func handler(w http.ResponseWriter, r *http.Request) {
cr := make(chan *http.Request, 1)
cr <- r
go process(w, cr) // doesn't work; no response :-(
// process(w, cr) // works, but blank response :-(
}
func init() {
http.HandleFunc("/add", handler)
}
net/http
包中内置的并发功能来处理web服务器,并使用类似Apache的ab
工具进行压力测试。如果出现问题,那就在实际操作中增加更多的并发性。不过目前来说,你已经可以直接获得并发请求处理的功能。 - Simon Whitehead