Goroutine阻止程序结束
我正在进行围棋之旅,这段代码真的融化了我的心:Goroutine阻止程序结束,go,Go,我正在进行围棋之旅,这段代码真的融化了我的心: 主程序包 输入“fmt” func-fibonacci(c,int){ x、 y:=0,1 为了{ 挑选{ 太长了,读不下去了 由于您从未向quit频道写入任何内容,因此您的程序在select case语句中不断生成值,并将它们添加到c频道,而没有使用者 解释 代码正在等待将某些内容添加到quit频道。由于没有写入,程序将继续计算斐波那契序列 并发编程与“标准”线性编程非常不同 您删除的行将保证quit通道中有足够的数据来结束程序,因为fib功能仅
主程序包
输入“fmt”
func-fibonacci(c,int){
x、 y:=0,1
为了{
挑选{
太长了,读不下去了
由于您从未向quit
频道写入任何内容,因此您的程序在select case
语句中不断生成值,并将它们添加到c
频道,而没有使用者
解释
代码正在等待将某些内容添加到quit
频道。由于没有写入,程序将继续计算斐波那契序列
并发编程与“标准”线性编程非常不同
您删除的行将保证quit
通道中有足够的数据来结束程序,因为fib
功能仅在从该通道读取时结束
{//无限循环的
案例c程序直到main
返回才结束。你创建了死锁,所以运行时告诉你了。@JimB我不明白,什么是死锁?感谢你解释得很好的回答,它消除了我的困惑。不过我不得不问一下,你提到没有数据被添加到c
频道,即使有数据被添加在第一种情况下添加。这是否意味着如果没有接收器,则无法向发送方添加数据?很抱歉,我错误地读取了,因为I:=0;I<5;I++
循环。此循环从c
通道读取五个“数据”,并结束。此后,fibonacci
函数上的无限循环不断生成值并添加它们到频道。你的程序没有卡住,只是没有结束。你的编辑不是很准确,根据定义,这仍然是一个死锁,堆栈跟踪甚至可以准确地显示阻塞操作发生的位置。fibonacci
函数在select
中被阻塞,main
是阻塞等待fibonacci>
返回。如果仍有某些内容“生成”值,则不会出现死锁,因为某些goroutine将继续运行。@kwevelis:来自巡更本身:“默认情况下,发送和接收块,直到另一端准备就绪”。这就是如何使用通道在goroutine之间进行同步。@JimB感谢您的回复。我的困惑是-尽管我知道这是一个死锁(在错误消息中)-我不知道我为什么会得到它。我想如果main
线程中没有更多的代码可执行,程序将忽略所有通道和goroutine,然后结束。根据您的解释和@rafadeboas的解释,我的理解是main
线程将阻塞,等待来自的响应一种select
情况。由于select
卡在一个无限循环中,只需向通道添加值,而另一端没有任何接收器