【发布时间】:2018-12-11 21:32:27
【问题描述】:
所以我开始玩弄围棋,并且对围棋例程很着迷。我现在写了一个简单的测试,看看我是否可以在不断打印变量的同时改变它的值。
我现在有以下代码:
package main
import (
"fmt"
"time"
)
func change(c chan float64) float64 {
time.Sleep(2 * time.Second)
return 2.5
}
func main() {
s := 1.1
c := make(chan float64)
go change(c)
s = <-c
for {
fmt.Println(s)
time.Sleep(100 * time.Millisecond)
}
}
不幸的是它以错误结束:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/home/kramer65/repos/go/src/messing_around/main.go:19 +0x7d
exit status 2
我四处搜索,发现这个死锁发生在 main 函数结束而 goroutines 还没有结束时。但由于我有一个无限循环,我不知道我的代码还有什么问题。
谁能告诉我这段代码有什么问题,以及我如何在不断打印出变量的同时更改它的值?欢迎所有提示!
【问题讨论】:
-
因为没有发送到通道
c,所以程序在从c接收时永远阻塞。我猜你打算在change函数中使用c <- 2.5而不是return 2.5。 -
在进入循环之前,您尝试在
c上接收,但在c上没有发送任何内容。 -
仔细查看堆栈跟踪,您会发现 main 永远不会进入 for 循环。 The Tour 逐步解释频道。 “当主函数结束而 goroutines 尚未结束时发生死锁”是不正确的。当 main 完成时,无论如何程序都会终止。
标签: go concurrency multiprocessing deadlock