当前位置: 首页 > news >正文

GO channel 学习

引言

单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。
虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。


Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而
不是通过共享内存而实现通信。如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。


Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出
(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也
就是声明channel的时候需要为其指定元素类型。 

package mainimport "fmt"// 类似于pipe[]管道
func main() {//ch := make(chan int, 10) //有缓冲大小的管道//ch <- 12//var x int//x = <-ch//fmt.Println(x)//c := make(chan int) //开辟的空间 cap是3,长度////go func() {//	defer println("go 程关闭")//	fmt.Println("go 程运行正在向chan写入数据")//	c <- 666 //由于是无缓冲的,所以必须得立刻接收,不然一直阻塞//}()//num := <-c//fmt.Println("主程序接受管道 值为:", (num))//fmt.Println(len(c), cap(c))//ch := make(chan int)//go func() {//	defer close(ch) //延迟关闭通道//	for i := 0; i < 5; i++ {//		ch <- i//	}//}()//for {//	if data, ok := <-ch; ok {//		fmt.Println(data)//	} else {//		break//	}//}/*c := make(chan int)go func() {for i := 0; i < 5; i++ {c <- itime.Sleep(1 * time.Second)}close(c)}()//迭代,会自动阻塞for data := range c {fmt.Println(data)}*///	select 多路复用c := make(chan int)quit := make(chan int)go func() {for i := 0; i < 5; i++ {fmt.Println(<-c)}quit <- 0}()fibonace(c, quit)}func fibonace(c, quit chan int) {x, y := 1, 1for {select {case c <- x: //如果c可写 ,x就会进来x, y = y, x+ycase <-quit:fmt.Println("quit")return}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 杜比全景声——空间音频技术
  • 36.UART(通用异步收发传输器)-RS232(3)
  • 游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件
  • 用Python爬虫能实现什么?得到什么?
  • 微信小程序密码 显示隐藏 真机兼容问题
  • [AI 大模型] 百度 文心一言
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(八)-通过无人机进行无线接入
  • 【信息收集】域名信息收集
  • 接口测试框架基于模板自动生成测试用例!
  • 前端时间格式传入后端负载里面没有东西
  • c++包管理器
  • 使用Python和MediaPipe实现手势控制音量(Win/Mac)
  • socket编程(2) -- TCP通信
  • 【Linux】进程的基本概念(以及进程地址空间的初步了解)
  • GCN-LSTM实现时空预测
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • CentOS 7 防火墙操作
  • HashMap剖析之内部结构
  • JS基础之数据类型、对象、原型、原型链、继承
  • PermissionScope Swift4 兼容问题
  • 不上全站https的网站你们就等着被恶心死吧
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 大型网站性能监测、分析与优化常见问题QA
  • 解析 Webpack中import、require、按需加载的执行过程
  • 爬虫模拟登陆 SegmentFault
  • 最简单的无缝轮播
  • puppet连载22:define用法
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #if 1...#endif
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (30)数组元素和与数字和的绝对差
  • (k8s)Kubernetes本地存储接入
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (三)SvelteKit教程:layout 文件
  • (四)Linux Shell编程——输入输出重定向
  • (四)linux文件内容查看
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)创业的注意事项
  • .NET Core中如何集成RabbitMQ
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET的数据绑定
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • //解决validator验证插件多个name相同只验证第一的问题
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [100天算法】-目标和(day 79)
  • [20171113]修改表结构删除列相关问题4.txt
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [BUUCTF]-Reverse:reverse3解析
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C++] Windows中字符串函数的种类
  • [C++核心编程](四):类和对象——封装