如果我正確理解你的問題,你希望能夠退出例程處理隊列?
超時設置在此處不起作用。這是針對服務器/客戶端心跳的,並且只有在任何時間沒有收到心跳的情況下才會開始使用,但是對於沒有在隊列中接收到幀而不做任何事情。
我的建議是一樣的東西
import "sync"
import "os/signal"
var (
wg sync.WaitGroup
sigs = make(chan os.Signal, 1)
stop = make(chan bool)
)
func main() {
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
//your other setup stuff
wg.Add(2)
go myQueueProcessor()
go mySignalProcessor()
//Now your main will wait for your goroutines to finish here.
wg.Wait()
//your program cleanup stuff
}
func myQueueProcessor() {
defer wg.Done()
//keep running over the select indefinitely
for {
select {
case <-stop: //if the stop channel is closed exit out of go routine
return
case msg := <-sub.C: //Whatever queue processes you want
//do message stuff
}
}
}
func mySignalProcessor() {
defer wg.Done()
select {
case sig := <-sigs:
close(stop)
return
}
}
現在,如果你把你的程序的終止信號,它會抓住它,關閉停止頻道和隊列處理的goroutine將退出出來的東西應該關閉乾淨。