package main
import (
"fmt"
"sync"
"time"
)
func workRoutine(work chan string, done chan string, wg *sync.WaitGroup) {
select {
case donemsg := <-done:
fmt.Println(donemsg)
case msg := <-work:
//这里将有大量工作可能半个小时都未必执行完,这样 done 这个 channel 就无法收到退出信号
for i := 0; i < 100000; i++ {
fmt.Println(msg)
time.Sleep(time.Second)
}
case <-time.After(time.Second * 1000):
fmt.Println("timeout")
}
wg.Done()
}
func closeWorkRoutine(done chan string, wg *sync.WaitGroup) {
//目标是 10 秒后希望能关掉 test 这个协程
time.Sleep(time.Second * 10)
done <- "done"
wg.Done()
}
func main() {
done := make(chan string)
work := make(chan string, 1)
wg := sync.WaitGroup{}
wg.Add(2)
work <- "work"
go workRoutine(work, done, &wg)
go closeWorkRoutine(done, &wg)
wg.Wait()
}
请参考上面的代码,我现在有两个协程,一个叫 workRoutine ,另一个叫 closeWorkRoutine ,我的目标是希望 closeWorkRoutine 可以在 10 秒后可以关闭 workRoutine 的协程,但是上面这个代码是无法关闭的,因为 work 过于繁重,永远轮不到执行关闭的时候。请问有什么办法可以直接关闭协程,而无需介意当前协程的状态,最好能像线程那样有一个 ID 我可以直接在外部强制关掉,请问我应该如何做呢,谢谢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.