gpt4 book ai didi

google-app-engine - 使用 Golang channel 处理 HTTP 请求

转载 作者:IT王子 更新时间:2023-10-29 01:55:38 28 4
gpt4 key购买 nike

我正在尝试构建一个简单的 Golang/Appengine 应用程序,它使用一个 channel 来处理每个 http 请求。原因是我希望每个请求都执行合理的大型内存计算,并且每个请求都以线程安全的方式执行很重要(即来自并发请求的计算不会混淆)。

本质上,我需要一个同步队列,一次只处理一个请求, channel 看起来很自然。

Is it possible to use Go's buffered channel as a thread-safe queue?

但是我无法让我的简单的 hello world 示例运行。它似乎在“go process(w, cr)”这一行失败了;我从服务器收到 200 响应,但没有内容。如果我从这一行中删除“go”,工作正常,但我猜我没有正确调用 channel 。

有人指出我哪里出错了吗?

谢谢!

// 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)
}

最佳答案

不确定这是正确的设计,但我怀疑问题在于您开始第二个 go 例程的地方第一个 go 例程继续并完成写入连接等。

要停止这种情况,您可以使用 WaitGroup (http://golang.org/pkg/sync/#WaitGroup) 让第一个例程等待。

这停止了为什么你试图将它放入一个线程背后的整个推理(因此我认为你遇到了设计问题)。

这里有一些未经测试的代码应该可以工作或者至少有助于正确的方向。

package main

import (
"encoding/json"
"net/http"
"sync"
)

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
var pleasewait sync.WaitGroup
pleasewait.Add(1)

go func() {
defer pleasewait.Done()
process(w, cr) // doesn't work; no response :-(
}()
// process(w, cr) // works, but blank response :-(

pleasewait.Wait()
}

func main() {
http.HandleFunc("/add", handler)
}

关于google-app-engine - 使用 Golang channel 处理 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721084/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com