go - 选择频道时遇到死锁
问题描述
package main
import (
"fmt"
"time"
)
func Server1(ch chan string) {
time.Sleep(2*time.Second)
ch <- "from Server-1"
}
func Server2(ch chan string) {
time.Sleep(3*time.Second)
ch <- "from Server-2"
}
func main() {
input1 := make(chan string)
input2 := make(chan string)
go Server1(input1)
go Server2(input2)
for {
select {
case s1 := <- input1:
fmt.Printf(s1 + "\n")
case s2 := <- input2:
fmt.Printf(s2 + "\n")
}
}
}
运行上面的代码,得到如下错误
from Server-1
from Server-2
fatal error: all goroutines are asleep - deadlock!
在这个通道选择中,我们有两个线程以不同的计时器间隔运行,为什么会死锁?
解决方案
您启动 2 个仅在其通道上发送单个值的 goroutine,然后它们将终止,因此该main
函数将单独挂在那里。这就是僵局的原因。
如果您无休止地修改Server1()
和Server2()
发送值,则不会出现死锁:
func Server1(ch chan string) {
for {
time.Sleep(2 * time.Second)
ch <- "from Server-1"
}
}
func Server2(ch chan string) {
for {
time.Sleep(3 * time.Second)
ch <- "from Server-2"
}
}
推荐阅读
- javascript - How to implement side effect on observable property?
- java - 当另一个元素隐藏在 NetBeans 中时,如何阻止元素移动?
- python - 如何在 sortedcontainers.SortedDict 中设置排序谓词?
- java - nexus-staging-maven-plugin 是如何使用的
信息? - php - PHP XML 最后一个数组到 Int
- windows - 以下脚本有什么作用?
- macos - Metal 使用计算着色器模拟几何着色器
- json - 更新 JSON 文件 NodeJS
- r - How to detect warnings in R and have a while loop run on a function as along as warnings are outputted?
- android - 如何将此代码更改为 AsyncTask?