【发布时间】:2020-06-14 19:32:02
【问题描述】:
我正在尝试暂停和恢复 groutine。我知道我可以sleep 运行,但我正在寻找的是一个按钮“暂停/恢复”而不是一个计时器。
这是我的尝试。我正在使用通道的阻塞功能来暂停,select 根据通道值切换要执行的内容。然而,在我的例子中,输出总是Running。
func main() {
ctx := wctx{}
go func(ctx wctx) {
for {
time.Sleep(1 * time.Second)
select {
case <-ctx.pause:
fmt.Print("Paused")
<-ctx.pause
case <-ctx.resume:
fmt.Print("Resumed")
default:
fmt.Print("Running \n")
}
}
}(ctx)
ctx.pause <- struct{}{}
ctx.resume <- struct{}{}
}
type wctx struct {
pause chan struct{}
resume chan struct{}
}
【问题讨论】:
-
只有一种方法可以暂停和恢复 goroutine,但此功能存在于运行时 github.com/golang/go/blob/master/src/runtime/… 中。否则,您可以尝试双重锁定和双重解锁互斥锁。通常,您不想这样做。
-
听起来像是 XY 问题。
标签: go concurrency channel goroutine