[英]How to signal to a goroutine to stop running?
我試圖阻止一個例行公事,但我找不到實現這個目標的方法。 我正在考慮使用第二個頻道,但如果我從中讀取它會阻止它不是嗎? 這是一些代碼,我希望解釋我正在嘗試做什么。
package main
import "fmt"
import "time"
func main() {
var tooLate bool
proCh := make(chan string)
go func() {
for {
fmt.Println("working")
//if is tooLate we stop/return it
if tooLate {
fmt.Println("stopped")
return
}
//processing some data and send the result on proCh
time.Sleep(2 * time.Second)
proCh <- "processed"
fmt.Println("done here")
}
}()
select {
case proc := <-proCh:
fmt.Println(proc)
case <-time.After(1 * time.Second):
// somehow send tooLate <- true
//so that we can stop the go routine running
fmt.Println("too late")
}
time.Sleep(4 * time.Second)
fmt.Println("finish\n")
}
有幾種方法可以實現,最簡單,最方便的是使用另一個渠道,如:
func main() {
tooLate := make(chan struct{})
proCh := make(chan string)
go func() {
for {
fmt.Println("working")
time.Sleep(1 * time.Second)
select {
case <-tooLate:
fmt.Println("stopped")
return
case proCh <- "processed": //this why it won't block the goroutine if the timer expirerd.
default: // adding default will make it not block
}
fmt.Println("done here")
}
}()
select {
case proc := <-proCh:
fmt.Println(proc)
case <-time.After(1 * time.Second):
fmt.Println("too late")
close(tooLate)
}
time.Sleep(4 * time.Second)
fmt.Println("finish\n")
}
您還可以查看使用sync.Cond
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.