【问题标题】:Write to same channel with multiple goroutines使用多个 goroutine 写入同一通道
【发布时间】:2015-06-03 06:16:23
【问题描述】:

这段代码可以正常工作,我的问题是为什么。我了解到,在阻塞之前,您只能将一个值发送到无缓冲通道。但是在我的代码中,我写了两次,但是来自不同的 go 例程,它可以工作。如果有人可以向我解释原因,将不胜感激!

func main(){
    var ch chan string =make(chan string)
     go write(ch)
     go write2(ch)
     go read(ch)
        select{}
}

func write(ch chan string){
    for{
        ch<-"write1"
    }
}

func write2(ch chan string){
    for{
        ch<-"write2"
    }
}

func read(ch chan string){
    for{    
        time.Sleep(time.Second)
        select{
            case res:= <-ch: fmt.Println(res)
            case <-time.After(time.Millisecond*200): fmt.Println("time out")
        }
    }
}

【问题讨论】:

    标签: go channels


    【解决方案1】:

    您可以再次对其进行写入,因为您已从中读取。在读取操作之后,可能会发生另一次写入。从哪个 goroutine 执行写入或读取操作并不重要。

    Go Memory Management 页面对此进行了说明。

    【讨论】:

    • 谢谢。因此,当“write”已写入 ch 时,“write2”将等待/阻塞,直到我的“read”函数接收到来自“write”的值?
    • 是的,完全正确。这样,通道不仅可以用于传递数据,还可以用于同步执行。
    • 谢谢伙计!非常感谢您抽出宝贵时间!
    猜你喜欢
    • 2019-10-08
    • 2018-10-23
    • 2020-08-02
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2013-05-21
    • 2016-05-31
    相关资源
    最近更新 更多