我以为我找到了一种简单的方法来立即返回 http 响应,然后在后台做一些工作而不会阻塞。但是,这不起作用。func MyHandler(w http.ResponseWriter, r *http.Request) { //handle form values go doSomeBackgroundWork() // this will take 2 or 3 seconds w.WriteHeader(http.StatusOK)}它第一次工作——立即返回响应并开始后台工作。但是,任何进一步的请求都会挂起,直到后台 goroutine 完成。有没有更好的方法来做到这一点,它不涉及设置消息队列和单独的后台进程。
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
Go 将 goroutine 复用到由GOMAXPROCS
环境设置确定的可用线程上。因此,如果将其设置为 1,则单个 goroutine 可以占用 Go 可用的单个线程,直到它将控制权交还给 Go 运行时。很可能doSomeBackgroundWork
一直在单个线程上占用,这阻止了 http 处理程序被调度。
有多种方法可以解决此问题。
首先,作为使用 goroutines 时的一般规则,您应该设置GOMAXPROCS
为系统拥有的 CPU 数量或较大者。
其次,您可以通过执行以下任一操作在 goroutine 中放弃控制权:
runtime.Gosched()
ch <- foo
foo := <-ch
select { ... }
mutex.Lock()
mutex.Unlock()
所有这些都会回馈给 Go 运行时调度程序,让其他 goroutine 有机会工作。
- 2 回答
- 0 关注
- 183 浏览
添加回答
举报
0/150
提交
取消