我是一个 golang 新手,正试图了解这个问题的正确设计模式。我当前的解决方案似乎非常冗长,而且我不确定更好的方法是什么。
我正在尝试设计一个系统:
执行 N 个协程
一旦可用,就返回每个 goroutine 的结果
如果一个 goroutine 返回一个特定的值,它应该杀死其他 goroutines 将取消。
目标:我想启动多个 goroutine,但如果一个例程返回特定结果,我想取消这些例程。
我试图了解我的代码是否超级“臭”,或者这是否是规定的做事方式。我仍然没有很好的感觉,所以任何帮助将不胜感激。
这是我写的:
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
fooCheck := make(chan bool)
barCheck := make(chan bool)
go foo(ctx, 3000, fooCheck)
go bar(ctx, 5000, barCheck)
for fooCheck != nil ||
barCheck != nil {
select {
case res, ok := <-fooCheck:
if !ok {
fooCheck = nil
continue
}
if res == false {
cancel()
}
fmt.Printf("result of foocheck: %t\n", res)
case res, ok := <-barCheck:
if !ok {
barCheck = nil
continue
}
fmt.Printf("result of barcheck: %t\n", res)
}
}
fmt.Printf("here we are at the end of the loop, ready to do some more processing...")
}
func foo(ctx context.Context, pretendWorkTime int, in chan<- bool) {
fmt.Printf("simulate doing foo work and pass ctx down to cancel down the calltree\n")
time.Sleep(time.Millisecond * time.Duration(pretendWorkTime))
select {
case <-ctx.Done():
fmt.Printf("\n\nWe cancelled this operation!\n\n")
break
default:
fmt.Printf("we have done some foo work!\n")
in <- false
}
close(in)
}
func bar(ctx context.Context, pretendWorkTime int, in chan<- bool) {
fmt.Printf("simulate doing bar work and pass ctx down to cancel down the calltree\n")
time.Sleep(time.Millisecond * time.Duration(pretendWorkTime))
select {
case <-ctx.Done():
fmt.Printf("\n\nWe cancelled the bar operation!\n\n")
break
default:
fmt.Printf("we have done some bar work!\n")
in <- true
}
close(in)
}
输出按预期工作,但恐怕我正在做一些决定,稍后会吹走我的脚。
噜噜哒
米脂
相关分类