2 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
http.ListenAndServe(":8080", nil)運(yùn)行一個(gè)無(wú)限for循環(huán)監(jiān)聽入站連接,這就是為什么如果你之后調(diào)用它,代碼不會(huì)被調(diào)用的原因。
然后在這里
ticker := schedule(sendData, time.Second, done)
time.Sleep(60 * time.Second)
close(done)
ticker.Stop()
您將在 60 秒后退出內(nèi)部循環(huán)schedule(),因此您的自動(dòng)收?qǐng)?bào)機(jī)將只運(yùn)行一次或根本不會(huì)運(yùn)行(取決于完成通道是在自動(dòng)收?qǐng)?bào)機(jī)運(yùn)行之前還是之后收到值,因?yàn)樗鼈兪遣l(fā)的,我們無(wú)法確定他們的訂單)
所以你想要的是以下內(nèi)容
func main() {
http.HandleFunc("/data", headers)
ticker := time.NewTicker(time.Minute)
go schedule(ticker)
log.Printf("Ready for data ...%s\n", 8080)
http.ListenAndServe(":8080", nil)
}
func schedule(ticker *time.Ticker) {
for {
// This blocks until a value is received, the ticker
// sends a value to it every one minute (or the interval specified)
<-ticker.C
fmt.Println("Tick")
}
}
您可能已經(jīng)注意到,一旦服務(wù)器連接中斷,程序就會(huì)終止,因此沒有必要使用通道done來(lái)退出循環(huán)。

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊
您走在正確的軌道上——您只需要將代碼聲明包裝在一個(gè)自執(zhí)行函數(shù)中,然后將其作為 goroutine 運(yùn)行。ListenAndServe并且Schedule都是阻塞任務(wù),因此它們需要在單獨(dú)的 go 例程上運(yùn)行。幸運(yùn)的是,go 使這很容易實(shí)現(xiàn)。
注意 - 此示例代碼旨在盡可能接近您的示例。我建議將代碼的聲明與計(jì)劃函數(shù)分開。
func main() {
http.HandleFunc("/data", func(w http.ResponseWriter, req *http.Request) {}) //line 1
var done chan bool
go func() {
ticker := schedule(func() { fmt.Println("Tick") }, time.Second, done)
time.Sleep(60 * time.Second)
close(done)
ticker.Stop()
}()
fmt.Printf("Ready for data ...%v\n", 8080) //line 2
http.ListenAndServe(":8080", nil) //line 3
}
- 2 回答
- 0 關(guān)注
- 98 瀏覽
添加回答
舉報(bào)