2016-10-06 1 views
2

行き先が新しいです。サーバーがHTTPリクエストを受信して​​いると同時に、データを更新できるようにRedis通知をチェックする必要があるとします。以下の例は以下のとおりです。Golangでリッスンするサーバーと一緒にバックグラウンドタスクを実行するベストプラクティスは何ですか?

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

server.ListenAndServe() 

単に良い解決策ゴルーチンへcheckExpireを入れていますか?

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

なぜですか?それは完全にうまくいくはずです。 – tier1

+0

私はあなたが何を求めているのか分からず、ゴルーチンはGoで同時に何かを実行する方法です。他に何をしますか? – JimB

+0

ゴルーチンは、メインプロセスが終了するのを妨げないことに注意してください。 main()の最後に 'for {} 'でブロックする必要があるかもしれません。 * edit *実際にはserver.ListenAndServeはブロックする必要があります – Plato

答えて

4

はい、とmainがあまりにもゴルーチンであることを覚えて、ここで作業コードは次のとおりです。

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を開きます。


、決して空ループ(for{})を使用して参照してください。
Difference between the main goroutine and spawned goroutines of a Go program

を空のループは、使用可能なユースケースに応じて、いくつかの操作を待つために、CPUコアを100%使用しています。
- sync.WaitGroup
thisのような - select {}
thisのような - チャンネル
- time.Sleep

+0

私はあなたが答える前に何をすべきかを知っていましたが、私はまだあなたを受け入れます。どうも。 – laike9m

関連する問題