Go 在服务器侦听的同时运行后台任务的最佳实践是什么

Go 在服务器侦听的同时运行后台任务的最佳实践是什么,go,goroutine,Go,Goroutine,我是新来的。假设我有一台服务器正在侦听HTTP请求,同时我需要检查Redis通知,以便更新数据。以下是一个例子: func checkExpire() { for { switch msg := pubSubConn.Receive().(type) { case redis.Message: ... } } server.ListenAndServe() 简单地将checkExpire放入goroutine是一个好的解决方案吗

我是新来的。假设我有一台服务器正在侦听HTTP请求,同时我需要检查Redis通知,以便更新数据。以下是一个例子:

func checkExpire() {
    for {
        switch msg := pubSubConn.Receive().(type) {
        case redis.Message:
        ...
    }
}

server.ListenAndServe()
简单地将checkExpire放入goroutine是一个好的解决方案吗

go func() {
    for {
        switch msg := pubSubConn.Receive().(type) {
        case redis.Message:
        ...
    }
}()
是的,记住main也是一个goroutine,下面是工作代码:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}
func checkExpire() {
    for {
        // do some job
        fmt.Println(time.Now().UTC())
        time.Sleep(1000 * time.Millisecond)
    }
}

func main() {
    go checkExpire()
    http.HandleFunc("/", handler) // http://127.0.0.1:8080/Go
    http.ListenAndServe(":8080", nil)
}
运行代码并打开您的应用程序

决不要对{}使用空循环请参见:

空循环使用100%的CPU核心,根据您可能使用的用例等待某些操作: -sync.WaitGroup-like -选择{}类 -渠道
-时间。睡觉

为什么不呢?那应该很好。我不确定你在问什么,goroutines是你在Go中并发运行的方式。您还会做什么?请注意goroutines不会阻止主进程退出。您可能需要在main的末尾用for{}阻塞。编辑实际服务器。ListendServe应block@Plato对不起,我应该把listendserve放在checkExpire下面。虽然在你回答之前我知道该怎么做,但我还是会接受你的。Thx.与使用睡眠的for{}循环不同,您最好使用for{:=time.Tick。。。{}循环并避免睡眠。使用empty for in GO来阻止GO例程是完全正确的。事实上,有时候当你想做周期性的任务时,这是你唯一的方法。例如,```对于{select{case@adonese这不是空的,你的循环非常好,这是答案建议的事情之一。空在这里的字面意思是{}。我相信我回复的评论建议使用select而不是for{}进行阻塞。