当前位置:  开发笔记 > 编程语言 > 正文

前往频道-推送至频道会停止执行

如何解决《前往频道-推送至频道会停止执行》经验,为你挑选了1个好方法。

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

我想使用频道,以便我可以学习如何正确使用它们,而且可以说,我遇到了障碍。

这个想法是将correctAnswersCh从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
}

icza.. 5

您的correctAnswersCh频道是无缓冲的,因此在该频道上发送的任何内容都会阻塞,直到有人从该频道接收到。而且由于您的main()函数仅在超时后才从其接收,因此直到那时您的应用程序都被阻止。

一种简单的解决方法是为通道分配1个缓冲区:

correctAnswersCh := make(chan int, 1)

虽然这是一些奇怪的渠道用法。如果您打算创建并发安全计数器,请使用原子计数器,例如atomic.AddInt32()。另一种选择是当从多个goroutine中并发访问时,使用互斥锁(sync.Mutexsync.RWMutex)来保护资源(变量)。



1> icza..:

您的correctAnswersCh频道是无缓冲的,因此在该频道上发送的任何内容都会阻塞,直到有人从该频道接收到。而且由于您的main()函数仅在超时后才从其接收,因此直到那时您的应用程序都被阻止。

一种简单的解决方法是为通道分配1个缓冲区:

correctAnswersCh := make(chan int, 1)

虽然这是一些奇怪的渠道用法。如果您打算创建并发安全计数器,请使用原子计数器,例如atomic.AddInt32()。另一种选择是当从多个goroutine中并发访问时,使用互斥锁(sync.Mutexsync.RWMutex)来保护资源(变量)。

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有