golang 中的悬挂 goroutine
Dangling goroutine in golang
在下面的代码中
goroutine1
发生了什么?(在程序结束时我们有三个没有任何功能的 goroutine goroutine1
)
- 通道会发生什么情况?(当我们在循环中创建一个通道时,它会释放之前的通道内存?关闭它?还是其他?)
func main() {
for i := 1; i <= 3; i += 1 {
ch := make(chan int)
// gorutine1
go func() {
time.Sleep(3 * time.Second)
ch <- i
fmt.Println("gorutine1 end")
}()
// gorutine2
go func() {
time.Sleep(1 * time.Second)
ch <- i+1000
fmt.Println("gorutine2 end")
}()
fmt.Println("loop", <-ch)
}
time.Sleep(10 * time.Second)
fmt.Println("main end")
}
运行 以上代码 here
对于i=1
,循环创建两个goroutines,并开始等待从通道读取。 goroutine2 首先写入并终止。通道被读取,然后 i
变为 2。goroutine1 将永远等待,因为没有人会再次从通道读取。您创建一个新频道,然后做同样的事情。当一切都说完了,你有 goroutine1 的三个实例等待写入三个不同的通道。
在下面的代码中
goroutine1
发生了什么?(在程序结束时我们有三个没有任何功能的 goroutinegoroutine1
)- 通道会发生什么情况?(当我们在循环中创建一个通道时,它会释放之前的通道内存?关闭它?还是其他?)
func main() {
for i := 1; i <= 3; i += 1 {
ch := make(chan int)
// gorutine1
go func() {
time.Sleep(3 * time.Second)
ch <- i
fmt.Println("gorutine1 end")
}()
// gorutine2
go func() {
time.Sleep(1 * time.Second)
ch <- i+1000
fmt.Println("gorutine2 end")
}()
fmt.Println("loop", <-ch)
}
time.Sleep(10 * time.Second)
fmt.Println("main end")
}
运行 以上代码 here
对于i=1
,循环创建两个goroutines,并开始等待从通道读取。 goroutine2 首先写入并终止。通道被读取,然后 i
变为 2。goroutine1 将永远等待,因为没有人会再次从通道读取。您创建一个新频道,然后做同样的事情。当一切都说完了,你有 goroutine1 的三个实例等待写入三个不同的通道。