目前整个人都麻了。
不过精神状态还算稳定。
goroutine 这玩意,之前各种教程都在鼓吹,轻量级,简单。说这话的人他多半没写过。
首先写法上,就特别反人类。
- 不按顺序执行
- 嵌套地狱
- 奇怪的语法糖
我们来看下面的例子:
func process(depth, tasks int, wg *sync.WaitGroup, results chan<- int) {
defer wg.Done()
if depth == 0 {
for i := 0; i < tasks; i++ {
results <- doWork(i, depth)
}
return
}
subResults := make(chan int, tasks)
var subWg sync.WaitGroup
for i := 0; i < tasks; i++ {
subWg.Add(1)
go process(depth-1, tasks, &subWg, subResults)
}
go func() {
subWg.Wait()
close(subResults)
}()
total := 0
for result := range subResults {
total += result
}
results <- total
}
func main() {
rand.Seed(time.Now().UnixNano())
depth := 3
tasksPerLevel := 3
results := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go process(depth, tasksPerLevel, &wg, results)
go func() {
wg.Wait()
close(results)
}()
finalTotal := 0
for result := range results {
finalTotal += result
}
fmt.Printf("Final aggregated result: %d\n", finalTotal)
}
看完以后整个人还好吧?
样板代码一大片,只能依赖大模型来打草稿。但是,当你一不小心,遇到管道,网络连接的场景,很容易就出现,你的函数执行完了,协程还在,还去继续访问已经关闭的资源。而且很难定位到问题。
今天就吐槽到这里,目前工作语言变成了go,改日继续吐槽。