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

我以为我找到了一种简单的方法来立即返回 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 完成。有没有更好的方法来做到这一点,它不涉及设置消息队列和单独的后台进程。


叮当猫咪
浏览 184回答 2
2回答

慕沐林林

Go 将 goroutine 复用到由GOMAXPROCS环境设置确定的可用线程上。因此,如果将其设置为 1,则单个 goroutine 可以占用 Go 可用的单个线程,直到它将控制权交还给 Go 运行时。很可能doSomeBackgroundWork一直在单个线程上占用,这阻止了 http 处理程序被调度。有多种方法可以解决此问题。首先,作为使用 goroutines 时的一般规则,您应该设置GOMAXPROCS为系统拥有的 CPU 数量或较大者。其次,您可以通过执行以下任一操作在 goroutine 中放弃控制权:runtime.Gosched()ch <- foofoo := <-chselect { ... }mutex.Lock()mutex.Unlock()所有这些都会回馈给 Go 运行时调度程序,让其他 goroutine 有机会工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go