我知道这个问题是 4 年前发布的,但我希望有人能发现这很有用。
这是一种方法
有一种叫做工作池的东西https://gobyexample.com/worker-pools使用 go 例程和通道
但在下面的代码中,我将其调整为处理程序。(考虑为简单起见,我忽略了错误,我使用作业作为全局变量)
package main
import (
"fmt"
"net/http"
"time"
)
var jobs chan int
func worker(jobs <-chan int) {
fmt.Println("Register the worker")
for i := range jobs {
fmt.Println("worker processing job", i)
time.Sleep(time.Second * 5)
}
}
func handler(w http.ResponseWriter, r *http.Request) {
jobs <- 1
fmt.Fprintln(w, "hello world")
}
func main() {
jobs = make(chan int, 100)
go worker(jobs)
http.HandleFunc("/request", handler)
http.ListenAndServe(":9090", nil)
}
说明:
主要的()
- 使用 go 例程在后台运行 worker
- 使用我的处理程序启动服务
- 请注意,此时的工人已准备好接受工作
工人()
- 这是一个接收通道的 goroutine
- for 循环永远不会结束,因为通道永远不会关闭
- 当频道包含工作时,做一些工作(例如等待 5 秒)
处理程序()
- 写入通道以激活作业
- 立即将打印“hello world”返回到页面
很酷的是,您可以发送任意数量的请求,因为此场景仅包含 1 个工作人员。下一个请求将等到前一个请求完成。
这太棒了!