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