go - Golang 中只有一条消息就被不同地方的 channel 阻塞?

标签 go blocking channel

我正在尝试创建一个 channel ,用于确保一切准备就绪,

这样我就可以继续这个过程,一个例子如下:playground

package main

import (
    "fmt"
)

// done sends the channel a "okay" status.
func done(ok chan<- bool) {
    ok <- true
}

// waiting is a function that waiting for everything's okay.
func waiting(ok <-chan bool) {
    <-ok

    // Do something here
    // when everything's okay...
}

func main() {
    ok := make(chan bool)

    // Send the "ok" status once.
    go done(ok)

    // function A mockup
    waiting(ok)
    // function B mockup
    waiting(ok)

    fmt.Println("All Ok!")
}

这是输出:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
    /tmp/sandbox709143808/main.go:29 +0xc0

我无法发送ok <- true 一次

然后我可以在多个地方使用它,并得到如下输出:

All Ok!

Program exited.

但我不知道该怎么做,有什么想法吗?

最佳答案

您可以关闭 channel 而不是发送消息。关闭将如同将 ok 广播到所有监听例程

代码

package main

import (
    "fmt"
)

// done sends the channel a "okay" status.
func done(ok chan<- bool) {
    close(ok)
}

// waiting is a function that waits for everything's okay.
func waiting(ok <-chan bool) {
    <-ok

    // Do something here
    // when everything's okay...
}

func main() {
    ok := make(chan bool)

    // Send the "ok" status once.
    go done(ok)
    //go done(ok)

    // function A mockup
    waiting(ok)
    // function B mockup
    waiting(ok)

    fmt.Println("All Ok!")
}

这里是播放链接play.golang

关于go - Golang 中只有一条消息就被不同地方的 channel 阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42153675/

相关文章:

go - time.NewTimer 没有按我的预期工作

concurrency - Func 不会运行;增量 channel

cocoa-touch - -[NSInputStream 是否读取 :maxLength:] block?

go - 为什么同一个 Go Channel 不能启动两次?

node.js - 我不明白 golang,为什么我的应用程序不调用这个函数并且表现得不像 nodejs

go - 随着时间的流逝如何进行操纵?

javascript - Avast JS :Pdfka-PK infection warning with jQuery. min.js 但 jQuery.js 运行良好

c - 套接字读取速度非常慢的原因可能是什么?

json - 使用 simplejson 转 JSON

datetime - 如何解析自定义日期时间字符串