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

问题描述

两个goroutine,一个goroutine中做键盘的输入,另一个goroutine做其它数据处理。 运行后,如果我不输入数据,另一个goroutine也停止运行了。也没调度。我希望即使我不输入数据,也不要影响另一个goroutine。

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

package main

import (
    "fmt"
    "os"
    "bufio"
    "math/rand"
)

func main()  {
    msgChan := make(chan string)
    roundChan := make(chan int)

    sleepChan := make(chan bool)
    go input(msgChan)
    go roundNum(roundChan)

    go Scheduler(msgChan,roundChan)

    <-sleepChan
}

func Scheduler(msgChan chan string,roundChan chan int)  {
    var(
        msg string
        round int
    )
    for{
        select {
        case msg = <-msgChan:
             fmt.Println("msg:",msg)
        case round = <- roundChan:
             fmt.Println(round)
        }
    }
}

func roundNum(roundChan chan int)  {
    roundChan <- rand.Int()
}


func input(msgChan chan string)  {
    var(
        msg string
        err error
    )
    for{
       fmt.Println("请输入要回复的消息:")
       if msg,err =  bufio.NewReader(os.Stdin).ReadString('\n');err!=nil{
           return
      }
        msgChan<-msg
    }

}

你期待的结果是什么?实际看到的错误信息又是什么?

期待: 可以随时输入键盘数据,如果我输入键盘数据两个goroutine都正常运行。如果我不输入键盘数据,也不要影响另一个goroutine的执行。

阅读 4k
2 个回答

我把你的排版和标签都修改了,以后提问问题需要注意

根据你的描述,我猜测你想问的是 fmt.Println(round) 这个为啥一直不执行是吧。

肯定会打印一次,因为你的 roundNum 函数执行一次,发送了一个消息;然后它之后就退出了,所以以后你再也见不到它了;所以也没所以了

这个方法roundNum改一下:

func roundNum(roundChan chan int)  {
    for {
        roundChan <- rand.Int()
    }
}

roundNum方法只执行了一次,导致你的fmt.Println(round) 也只能执行一次。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题