使用多个goroutine写入同一通道
这段代码工作正常,我的问题是为什么。我了解到,在一个无缓冲通道被阻塞之前,您只能向其发送一个值。但是在我的代码中,我写了两次,但是来自不同的go例程,并且它工作正常。如果有人能向我解释原因,我将不胜感激使用多个goroutine写入同一通道,go,channels,Go,Channels,这段代码工作正常,我的问题是为什么。我了解到,在一个无缓冲通道被阻塞之前,您只能向其发送一个值。但是在我的代码中,我写了两次,但是来自不同的go例程,并且它工作正常。如果有人能向我解释原因,我将不胜感激 func main(){ var ch chan string =make(chan string) go write(ch) go write2(ch) go read(ch) select{} } func write(ch chan
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")
}
}
}
func main(){
变量ch chan string=make(chan string)
去写(ch)
写入2(ch)
阅读(ch)
选择{}
}
func写入(ch chan字符串){
为了{
ch您可以再次写入它,因为您是从它读取的。在读取操作之后,可能会发生另一次写入。goroutine从哪个执行写入或读取操作并不重要
页面对此进行了解释。谢谢。因此,当“写入”已写入ch时,“write2”将等待/阻止,直到我的“读取”函数从“写入”接收到值?是的,没错。这种方式可以使用通道同步执行,而不仅仅是传递数据。谢谢,伙计!非常感谢您抽出时间!