无缓冲channel(管道)

无缓冲channel(管道)1、无缓冲的通道(unbufferedchannel)是指在接收前没有能力保存任何值的通道,2、这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成和发送接收操作,如果两个goroutine没有同时准备好,通道会导致先执行或者接收操作的goroutine阻塞等待。3、这种对通道进行发送和接收的交互行为本身就是同步的,其中任意一个操作都无法离开另一个操作单独存在。funcmain(){ //创建一个有缓冲区的channel ch:=make(chanin

1、无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道,

2、这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成和发送接收操作,如果两个goroutine没有同时准备好,通道会导致先执行或者接收操作的goroutine阻塞等待。

3、这种对通道进行发送和接收的交互行为本身就是同步的,其中任意一个操作都无法离开另一个操作单独存在。

func main() { 
   
	// 创建一个无缓冲区的channel
	ch := make(chan int,0)

	lenNum := 4

	//len(ch)缓冲区剩余数据个数,cap(ch)缓冲区大小
	fmt.Printf("main len(ch) = %d, cap(ch) = %d\n", len(ch), cap(ch))

	// 新建协程
	go func() { 
   
		for i := 0; i < lenNum; i++ { 
   
			ch <- i //往chan写内容
			fmt.Println("子协程 i=", i)
		}

	}()

	time.Sleep(2 * time.Second)

	for i := 0; i < lenNum; i++ { 
   
		num := <-ch  //读管道中内容,没有内容,就会阻塞
		fmt.Printf("num = %d\n", num)
	}
}

运行结果如下:
在这里插入图片描述

4、通过上面的图可以看出,如果无缓存,子协程还没有执行完,就会阻塞去执行主协程

今天的文章无缓冲channel(管道)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/31298.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注