非零基础自学Golang 第13章 并发与通道 13.3 channel 13.3.1 channel类型 13.3.2 缓冲机制

news2025/1/24 4:54:03

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第13章 并发与通道
        • 13.3 channel
          • 13.3.1 channel类型
          • 13.3.2 缓冲机制

第13章 并发与通道

13.3 channel

goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。

引用类型channel是CSP模式的具体体现,用于多个goroutine之间的通信。其内部实现了同步,确保并发安全。

13.3.1 channel类型

channel是一种特殊的类型,和map类似,channel也是一个对应make创建的底层数据结构的引用。

声明一个channel的方式如下:

var 通道变量 chan 通道类型

通道变量是保存通道的引用变量;通道类型是指该通道可传输的数据类型。

当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者与被调用者都将引用同一个对象。和其他引用类型一样,channel的零值也是nil。

定义一个channel时,也需要定义发送到channel的值的类型。

channel可以使用内置的make()函数来创建:

make(chan Type) // 等价于make(chan Type, 0)

make(chan Type, capacity)

当capacity为0时,channel是无缓冲阻塞读写的;当capacity大于0时,channel是有缓冲、非阻塞的,直到写满capacity个元素才阻塞写入。

channel通过操作符“<-”来接收和发送数据,接收和发送数据的语法如下:

channel <- value //发送value到channel

<-channel //接收并将其丢弃

x := <-channel //从channel中接收数据,并赋值给x

x, ok := <-channel //同上,并检查通道是否关闭,将此状态赋值给ok

默认情况下,channel接收和发送数据都是阻塞的,除非另一端已准备好接收,这样就使得goroutine的同步更加简单,而不需要显式锁。

举个例子:

[ 动手写 13.3.1]

package main

import (
   "fmt"
   "time"
)

func main() {

   ch := make(chan string)

   go func() {
      fmt.Println(<-ch)
   }()

   ch <- "test"

   time.Sleep(time.Second)
}

动手写13.3.1中定义并创建了一个可以传输string类型的ch通道变量,在匿名协程函数中,从ch通道中接收数据并打印,运行结果如下:

在这里插入图片描述

13.3.2 缓冲机制

channel按是否支持缓冲区可分为无缓冲的通道(unbuffered channel)和有缓冲的通道(buffered channel)。

无缓冲的通道是指在接收前没有能力保存任何值的通道。

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

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

无缓冲的channel创建格式:

make(chan Type) //等价于make(chan Type, 0)

如果没有指定缓冲区容量,那么该通道就是同步的。

[ 动手写 13.3.2]

package main

import (
   "fmt"
   "time"
)

func main() {

   ch := make(chan int, 0)
   go func() {
      for i := 0; i < 3; i++ {

         fmt.Printf("len(ch) = %v , cap(ch) = %v\n", len(ch), cap(ch))
         ch <- i
      }
   }()

   for i := 0; i < 3; i++ {

      time.Sleep(time.Second)
      fmt.Println(<-ch)
   }
}

动手写13.3.2创建了一个无缓冲通道ch,由于该通道是无缓冲的,因此只有当接收者收到了数据,发送者才能继续发送数据,可以看到运行结果如下:

在这里插入图片描述

有缓冲通道是一种在被接收前能存储一个或多个值的通道。

创建一个有缓冲通道的方式如下:

make(chan Type, capacity)

这种类型的通道并不强制要求goroutine之间必须同时完成接收和发送。通道阻塞发送和接收的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。

只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。

这导致有缓冲的通道和无缓冲的通道之间有一个很大的不同:无缓冲的通道保证进行发送和接收的goroutine会在同一时间进行数据交换,有缓冲的通道没有这种保证。

[ 动手写 13.3.3]

package main

import (
   "fmt"
   "time"
)

func main() {

   ch := make(chan int, 3)
   go func() {
      for i := 0; i < 3; i++ {

         fmt.Printf("len(ch) = %v , cap(ch) = %v\n", len(ch), cap(ch))
         ch <- i
      }
   }()

   for i := 0; i < 3; i++ {
      time.Sleep(time.Second)
      fmt.Println(<-ch)
   }
}

动手写13.3.3创建了一个容量为3的缓冲channel,由于存在缓冲区,在缓冲区未填满的情况下,程序就不会被阻塞执行。

运行结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏玩得好的AI,已经在看病救人了

一个游戏AI&#xff0c;怎么干起医生的活了&#xff1f; 而且这本事还是从打游戏的经验里总结来的。 喏&#xff0c;拿一张病理全片扫描图像&#xff0c;不用遍历所有高倍镜视野&#xff0c;也能找到病灶所在。 在它看来&#xff0c;这个过程和《我的世界》里伐木居然是类似的…

Diffusion惊艳应用大赏

文&#xff5c;白鹡鸰自从Diffusion模型兴起之后&#xff0c;AI绘画圈又迎来了一波猪突猛进式的强化&#xff0c;早几年还只是Ins的二次元/迪士尼风格滤镜&#xff0c;让人穿上不同服装当接头霸王。现在&#xff0c;你随便输几句话&#xff0c;模型就能刷刷刷给你吐出一大堆精美…

024 | 知行国学:全国领先的线上一对一国学教育平台 | 大学生创新训练项目申请书 | 极致技术工厂

公司产品 公司的产品包括两个部分的内容&#xff0c;一是模块化、智能化的课程体系——“诗书礼乐”快乐国学课程体系&#xff0c;二是梯队化、“以一带群”、联动型的师资培训体系——“知行者”大学生国学师资培训模式。 近年来&#xff0c;国家大力弘扬中华优秀传统文化&a…

在Docker中的ubuntu中安装Python3和Pip

下载载python3.7 apt-get update apt-get install python3.7 建立软链接 先删除旧的python连接。 删除后建立新的连接关系&#xff0c;例如linux下python3默认在/usr/bin/下 rm -rf /usr/bin/python ln -s /usr/bin/python3.7 /usr/bin/python 进入python3.7的lib中&#xf…

基于springboot的疫情防控系统java疫情防控物资管理平台源码和论文

系统开发技术介绍 2.1 MySQL数据库 社区疫情防控系统采用了一款开源免费的关系型数据库——MySQL数据库进行开发&#xff0c;因为它不收取任何费用&#xff0c;免费提供给各个开发者使用学习使用&#xff0c;使本次系统开发成本大大降低了。由于MySQL数据库体积小&#xff0c…

5.5 5个小红书月销售10W+的商家【玩赚小红书】

一、SWEETIEDOTS&#xff1a;蛋糕 简介 &#xff1a;甜点类商家&#xff0c;独创罐装厚卡龙、创新手工点心甜点&#xff0c;目前在小红书有2.7W粉丝&#xff0c;点赞评超7W&#xff0c;在简介上&#xff0c;告诉用户在薯店进行购买&#xff0c;客单价在98-108元。 内容&#x…

堆堆排序加强堆和堆有关的题一网打尽

堆结构、堆排序 堆结构的实现 堆结构就是用数组实现的完全二叉树结构 2)完全二叉树中如果每颗子树的最大值都在顶部就是大根堆 3)完全二叉树中如果每颗子树的最小值都在顶部就是小根堆 4)堆结构的向上调整和向下调整算法 向上调整 向下调整 5)堆结构某个元素的增大和减少 …

安卓手机独有的6个功能,个个都很实用,你用过几个呢?

安卓和苹果&#xff0c;你更喜欢哪一种&#xff1f;今天我整理了6个安卓独有的功能&#xff0c;不看不知道&#xff0c;一看安卓用户可能会吓一跳。因为这些功能真的很实用&#xff0c;但是苹果却没有这些功能。第一种&#xff1a;更改默认打开的应用 苹果系统无法直接更改默认…

【数据库】MVCC

Multi-version Concurrency Control DBMS 维护一个对象的多版本在数据库中。所以事务可以访问历史版本信息。 只依赖MVCC做不到可串行化&#xff1b; 一个事务在改对象的时候&#xff0c;留下一个历史版本&#xff0c;其他的事务可以读这个历史版本的数据。 读者不锁写着&a…

ch3_2多进程中寄存器的切换

运行中的程序在进行切换时&#xff0c; 可以分为以下两类&#xff1a; 线程&#xff1a; 只涉及指令的切换&#xff0c; 硬件资源没有切换&#xff1b;进程&#xff1a; 包含指令的切换&#xff0c;以及硬件资源的切换&#xff0c; 其中映射表便是一种内存资源。 1. 进程间的…

用3Dmax优化模型的方法,让你的效果图又快又好

3DMax是一个特别强大的建模软件&#xff0c;它具有无数需要小伙伴付出时间和练习才能掌握的特性和功能。 如果你已经能足够直观的掌握基础知识&#xff0c;并且已经能创造出很优秀的作品。这必然是一件值得高兴的事。 但是&#xff0c;在设计过程的妙处就在于&#xff0c;总是…

Prometheus集成Grafana(手动创建/通过模板创建Dashboard)

目录1. Grafana的基本介绍2. Centos7上安装Grafana2.1 下载解压2.2 修改conf/default.ini2.3 启动grafana3. Grafana各层级关系4. 添加Prometheus数据源5. 添加Dashborad和手动添加Row和Panel(方式一)6. 通过社区提供的模板创建Dashboard(方式二)1. Grafana的基本介绍 grafana…

自然语言基础之分词提取关键词基本操作

概述 从今天开始我们将开启一段自然语言处理 (NLP) 的旅程. 自然语言处理可以让来处理, 理解, 以及运用人类的语言, 实现机器语言和人类语言之间的沟通桥梁. 关键词 关键词 (keywords), 即关键词语. 关键词能描述文章的本质, 在文献检索, 自动文摘, 文本聚类 / 分类等方面有着…

我发现,被裁的一般都是情商低的人!网友:老板只看你有没有利用价值!

什么样的人容易被裁员&#xff1f;一位网友分享了自己的发现&#xff1a;被裁的一般都是情商比较低的。有人认同楼主&#xff0c;情商高能在一定程度上降低被裁的概率&#xff0c;大多数被裁的员工是因为情商不够&#xff0c;导致人际关系不好&#xff0c;才被辞退。有人说&…

JS如何读取对象内的一个属性两种方法

目录一&#xff1a;读取对象内的一个属性--可以用数组二&#xff1a;读取对象内的一个属性--可以用 .1、点的方式2、中括号的方式一&#xff1a;读取对象内的一个属性–可以用数组 二&#xff1a;读取对象内的一个属性–可以用 . let obj {name:张三,age:18,address:中国}1、…

【PAT甲级 - C++题解】1067 Sort with Swap(0, i)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;PAT题解集合 &#x1f4dd;原题地址&#xff1a;题目详情 - 1067 Sort with Swap(0, i) (pintia.cn) &#x1f511;中文翻译&#xff1a;用 Swap(0, i) 操作…

【关于时间序列的ML】项目 3 :基于机器学习的地震预测模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Datawhale powerful-numpy《从小白到入门》学习笔记

Datawhale powerful-numpy《从小白到入门》学习笔记 持续更新中 文章目录Datawhale powerful-numpy《从小白到入门》学习笔记摘自官方文档的一些话What is NumPy?Why is NumPy Fast?Who Else Uses NumPy?一.创建和生成1.从python列表或元组创建从列表创建从元组创建2.使用ar…

基于ISO13209(OTX)实现引导诊断

在上篇文章《基于ISO13209&#xff08;OTX&#xff09;实现EOL下线序列》中&#xff0c;讲到了OTX的由来以及OTX在EOL中的实现案例&#xff0c;而本文将讲述OTX的另一个广阔应用场景——定义引导诊断序列。 一 何为引导诊断&#xff1f; 引导诊断&#xff0c;通常也称为“引导…

市面上有哪些自动生成报表的工具?

每到月末、季度、年底&#xff0c;就是企业里各营销、财务、运营、企管等各部门“摆数据、晒业绩”的时候&#xff0c;除了财务因为有规范的制度约束&#xff0c;在规则和工具上更有保障&#xff08;最常见的就是在财务软件/ERP 里面自动生成三大周报&#xff09;之外&#xff…