使用多个goroutine写入相同的通道

Jak*_*son 2 go channels

这段代码正常工作,我的问题就是原因.我了解到,在阻止之前,您只能将一个值发送到无缓冲的通道.但是在我的代码中,我写了两次,但是来自不同的例行程序,它起作用.如果有人能向我解释原因,我将不胜感激!

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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Grz*_*Żur 6

您可以再次写入它,因为您从中读取它.读取操作后,可能会发生另一次写入 从哪个goroutine执行写入或读取操作并不重要.

转到内存管理页面解释它.

  • 谢谢。因此,当“write”写入 ch 时,“write2”将等待/阻塞,直到我的“read”函数收到“write”的值? (2认同)
  • 对,就是这样。通过这种方式,通道不仅可以用于传递数据,还可以用于同步执行。 (2认同)