加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Golang中运行后台任务和服务器监听的最佳实践是什么?

发布时间:2020-12-16 09:27:53 所属栏目:大数据 来源:网络整理
导读:我是Go的新手.假设我有一个服务器正在侦听HTTP请求,同时我需要检查Redis通知,以便我可以更新数据.以下是一个例子: func checkExpire() { for { switch msg := pubSubConn.Receive().(type) { case redis.Message: ... }}server.ListenAndServe() 将checkExp
我是Go的新手.假设我有一个服务器正在侦听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)
}

运行代码并打开您的browser.

永远不要使用Empty loop(for {})看:
Difference between the main goroutine and spawned goroutines of a Go program

空循环使用100%的CPU核心,根据您可能使用的用例等待某些操作:
? – sync.WaitGroup,如this
? – 选择{},如this? – 频道? – time.Sleep

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读