可执行程序在跨越空通道时抢先退出
Executable exiting preemptively when ranging over an empty channel
我最近遇到了一个编码练习,我在 python 中解决了这个问题,我不得不移植一个 "algorithm"。我不知道它是怎么称呼的,这就是我描述它的原因:
每个新行都是对前一行的描述,按顺序打印的相同数字和相关数字的数量。
这是一个例子:
1
11
21
1211
111221
312211
etc
我开始学习 Go 及其通道和并发功能。所以我回到这个练习,试图与 Go 并行更有效地解决它。
这是我到目前为止得到的:
package main
func main() {
channel := make(chan uint8)
go treeCalcRoutine(channel, 0)
channel <- 1
close(channel) //defer is not an option in this case because the channel has
//to be closed before main exits
}
func treeCalcRoutine(in <-chan uint8, generation int) {
if generation > 10 {
return // return after 10 recursive iterations
}
out := make(chan uint8)
defer close(out)
num := uint8(1)
previous := <-i
go treeCalcRoutine(out, generation+1)
for val := range in {
switch {
case val == previous:
num++
default:
num = uint8(1)
out <- num
out <- val
}
previous = val
}
out <- num
out <- previous
}
在尝试使用 Delve 调试程序时,我发现程序在尝试遍历 empty/closed 通道时无一例外地退出(并且退出状态为 0)。在这种情况下,我希望程序完全跳过 for 循环。
我仍然想自己解决这个挑战,所以如果有人能给我指出正确的方向而不是提供一个有效的解决方案,我将不胜感激。此外,请指出任何其他可以做得更好的 issues/cases(例如 generation
限制)。
编辑:
由于人们要求我 post 错误:由于某种原因根本没有错误。程序一旦到达for循环就退出。
所以问题实际上并不是 for 循环在遇到关闭的通道时退出,而是主例程在那个确切的时间退出,这导致所有其他 goroutine 也终止。我被建议在这种情况下使用等待组。
我最近遇到了一个编码练习,我在 python 中解决了这个问题,我不得不移植一个 "algorithm"。我不知道它是怎么称呼的,这就是我描述它的原因: 每个新行都是对前一行的描述,按顺序打印的相同数字和相关数字的数量。 这是一个例子:
1
11
21
1211
111221
312211
etc
我开始学习 Go 及其通道和并发功能。所以我回到这个练习,试图与 Go 并行更有效地解决它。 这是我到目前为止得到的:
package main
func main() {
channel := make(chan uint8)
go treeCalcRoutine(channel, 0)
channel <- 1
close(channel) //defer is not an option in this case because the channel has
//to be closed before main exits
}
func treeCalcRoutine(in <-chan uint8, generation int) {
if generation > 10 {
return // return after 10 recursive iterations
}
out := make(chan uint8)
defer close(out)
num := uint8(1)
previous := <-i
go treeCalcRoutine(out, generation+1)
for val := range in {
switch {
case val == previous:
num++
default:
num = uint8(1)
out <- num
out <- val
}
previous = val
}
out <- num
out <- previous
}
在尝试使用 Delve 调试程序时,我发现程序在尝试遍历 empty/closed 通道时无一例外地退出(并且退出状态为 0)。在这种情况下,我希望程序完全跳过 for 循环。
我仍然想自己解决这个挑战,所以如果有人能给我指出正确的方向而不是提供一个有效的解决方案,我将不胜感激。此外,请指出任何其他可以做得更好的 issues/cases(例如 generation
限制)。
编辑: 由于人们要求我 post 错误:由于某种原因根本没有错误。程序一旦到达for循环就退出。
所以问题实际上并不是 for 循环在遇到关闭的通道时退出,而是主例程在那个确切的时间退出,这导致所有其他 goroutine 也终止。我被建议在这种情况下使用等待组。