gpt4 book ai didi

在无限循环中显示奇怪的行为

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:45 24 4
gpt4 key购买 nike

我的 Go 代码中出现了非常奇怪的行为。总的要点是当我有

for {
if messagesRecieved == l {
break
}
select {
case result := <-results:
newWords[result.index] = result.word
messagesRecieved += 1
default:
// fmt.Printf("messagesRecieved: %v\n", messagesRecieved)
if i != l {
request := Request{word: words[i], index: i, thesaurus_word: results}
requests <- request
i += 1
}
}
}

程序卡住并且无法前进,但是当我取消注释掉 fmt.Printf 命令时,程序运行正常。可以看到整个代码here .有谁知道是什么导致了这种行为?

最佳答案

Go 在 1.1.2 版本(当前版本)中仍然只有原始的(自初始版本以来)协同调度 goroutines。编译器通过插入调度点来改进行为。从内存模型推断它们紧挨着 channel 操作。此外,还有一些众所周知但有意未记录的地方,例如发生 I/O 的地方。最后解释了为什么取消注释 fmt.Printf 会改变程序的行为。顺便说一句,Go tip 版本现在支持抢占式调度程序。

您的代码让您的一个 goroutine 忙于处理默认选择案例。由于没有其他没有打印的调度点,因此没有其他 goroutine 有机会取得进展(假设默认 GOMAXPROCS=1)。

我建议以一种避免旋转(忙等待)的方式重写程序的逻辑。一种可能的方法是在默认情况下使用 channel 发送。作为为此使用缓冲 channel 的一个很好的副作用,人们可以免费从中获得一个简单的限制器。

关于在无限循环中显示奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18692998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com