登录
首页 >  Golang >  Go问答

Channel Communication - 发送到通道会导致阻塞

来源:stackoverflow

时间:2024-03-10 22:48:24 248浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Channel Communication - 发送到通道会导致阻塞》,聊聊,我们一起来看看吧!

问题内容

我正在尝试创建一个命令行测验,用户将被问一个又一个问题,直到他们完成最后一个问题或超时。

我想使用渠道,这样我就可以学习如何正确使用它们,可以说,我遇到了障碍。

正确答案ch 的想法是从 0 开始,每次正确答案后,它都会增加 1。

在我将零放入通道后,测验始终停止在 quiz() 函数的第 3 行。

我在下面添加了一些代码,但完整的代码在这里: https://play.golang.org/p/vzrctc7mpik

func main() {
    questions, err := getCsvData()
    var limit = time.Duration(3)


    flag.Parse()

    if err != nil {
        log.Fatal(err)
    }

    quizComplete := make(chan bool)
    correctAnswersCh := make(chan int)
    go quiz(quizComplete, questions, correctAnswersCh)

    select {
    case <-time.After(limit*time.Second):
        fmt.Println("Timed Out")
    }
    fmt.Printf("Correct Answers: %v\n", <-correctAnswersCh)
}

func quiz(quizComplete chan bool, questions [][]string, correctAnswersCh chan int) {
    reader := bufio.NewReader(os.Stdin)
    correctAnswersCh <- 0
    // execution stops here.  0 is added to correctAnswersCh, then the quiz func stops
    for _, question := range questions {

        fmt.Print(question[0], "= ")
        answer, _ := reader.ReadString('\n')

        if strings.TrimSpace(answer) == question[1] {
            cA := <-correctAnswersCh
            cA++
            correctAnswersCh <- cA
        }
    }
    quizComplete <- true
}

解决方案


您的 correctanswersch 频道是无缓冲的,因此在该频道上发送任何内容都会受到阻塞,直到有人从中接收。由于您的 main() 函数仅在超时后接收来自它的信息,因此在此之前您的应用程序将被阻止。

一个简单的解决方法是为通道提供 1 个缓冲区:

correctAnswersCh := make(chan int, 1)

尽管这是通道的一些奇怪用法。如果您的目的是创建并发安全计数器,请使用自动计数器,例如atomic.AddInt32()。另一种选择是使用互斥锁(sync.Mutexsync.RWMutex)来保护从多个 goroutine 并发访问时的资源(变量)。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>