为了账号安全,请及时绑定邮箱和手机立即绑定

在 http 处理程序中使用 Goroutines 进行后台工作

在 http 处理程序中使用 Goroutines 进行后台工作

Go
叮当猫咪 2021-06-15 17:01:51
我以为我找到了一种简单的方法来立即返回 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 有机会工作。


查看完整回答
反对 回复 2021-06-28
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信