猿问

go语言bufio.NewReader(os.Stdin) 阻塞了goroutine调度,怎么解决?

问题描述
两个goroutine,一个goroutine中做键盘的输入,另一个goroutine做其它数据处理。运行后,如果我不输入数据,另一个goroutine也停止运行了。也没调度。我希望即使我不输入数据,也不要影响另一个goroutine。
问题出现的环境背景及自己尝试过哪些方法
相关代码
//请把代码文本粘贴到下方(请勿用图片代替代码)
packagemain
import(
"fmt"
"os"
"bufio"
"math/rand"
)
funcmain(){
msgChan:=make(chanstring)
roundChan:=make(chanint)
sleepChan:=make(chanbool)
goinput(msgChan)
goroundNum(roundChan)
goScheduler(msgChan,roundChan)
<-sleepChan
}
funcScheduler(msgChanchanstring,roundChanchanint){
var(
msgstring
roundint
)
for{
select{
casemsg=<-msgChan:
fmt.Println("msg:",msg)
caseround=<-roundChan:
fmt.Println(round)
}
}
}
funcroundNum(roundChanchanint){
roundChan<-rand.Int()
}
funcinput(msgChanchanstring){
var(
msgstring
errerror
)
for{
fmt.Println("请输入要回复的消息:")
ifmsg,err=bufio.NewReader(os.Stdin).ReadString('\n');err!=nil{
return
}
msgChan<-msg
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
期待:可以随时输入键盘数据,如果我输入键盘数据两个goroutine都正常运行。如果我不输入键盘数据,也不要影响另一个goroutine的执行。
慕尼黑5688855
浏览 444回答 2
2回答

郎朗坤

我把你的排版和标签都修改了,以后提问问题需要注意根据你的描述,我猜测你想问的是fmt.Println(round)这个为啥一直不执行是吧。肯定会打印一次,因为你的roundNum函数执行一次,发送了一个消息;然后它之后就退出了,所以以后你再也见不到它了;所以也没所以了
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答