Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

GO协程初识

package mainimport ("fmt""sync""time"
)func read() {defer wg.Done()fmt.Println("read start")time.Sleep(time.Second * 3)fmt.Println("read end")
}func listenMusci() {defer wg.Done()fmt.Println("listenMusci start")time.Sleep(time.Second * 5)fmt.Println("listenMusci end")
}var wg sync.WaitGroup //声明一把锁,同步的一个等待锁,本质是一个计时器,所有的进程都可以共享func main() {start := time.Now().Unix()wg.Add(2)go read()        //开启GO并发go listenMusci() //开启GO并发wg.Wait() //计数器为0继续执行//time.Sleep(time.Second * 10) //将main主线程阻塞下end := time.Now().Unix()fmt.Println(end - start)
}

输出结果:
在这里插入图片描述

互斥锁

package mainimport ("fmt""sync""time"
)/*互斥锁!!!
互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有
一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,
其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才可以获取锁进入临界区,
多个goroutine同时等待一个锁时,唤醒的策略是随机的。
*/
var wg sync.WaitGroup //声明一把锁,同步的一个等待锁,本质是一个计时器,所有的进程都可以共享
var lock sync.Mutexvar x = 0func add() {defer wg.Done()//加锁,互斥锁lock.Lock()x++lock.Unlock()println(x)time.Sleep(time.Second * 10) //
}
func main() {wg.Add(100)for i := 0; i < 100; i++ {go add()}wg.Wait() //计数器为0继续执行fmt.Println(x)
}

管道:channel的读写操作

package mainimport ("fmt""reflect"
)/*管道:channel的读写操作!!!chan是go的协程之间通信的数据类型(引用类型)没有索引的概念,取完第一个才能取第二个
*/
func 声明一个管道() {//声明一个管道var ch = make(chan int, 3)//插入值ch <- 12ch <- 13ch <- 15//取值fmt.Println(<-ch)fmt.Println(<-ch)fmt.Println(<-ch)
}//声明一个结构体
type Msg struct {content stringfrom    string
}func main() {var ch = make(chan interface{}, 6)ch <- "hello"ch <- truech <- 15ch <- Msg{content: "from kegog", from: "中国北京"}one := <-chfmt.Println(one, reflect.TypeOf(one))fmt.Println(<-ch)fmt.Println(<-ch)//fmt.Println(<-ch)fmt.Println((<-ch).(Msg).content)
}

管道关闭后不能再写入值了

package mainimport "fmt"/*管道的关闭与循环!!
*/
func 管道关闭后不能再写入值了() {ch3 := make(chan int, 10)ch3 <- 1ch3 <- 2ch3 <- 3close(ch3)fmt.Println(<-ch3)ch3 <- 4
}
func main() {管道关闭后不能再写入值了()
}

遍历管道之前要先关闭管道close

package mainimport ("fmt""time"
)func main() {ch := make(chan int, 10)ch <- 1ch <- 2ch <- 3// 方式1go func() {time.Sleep(time.Second * 10)ch <- 4}()for v := range ch {fmt.Println(v, len(ch))// 读取完所有值后,ch的sendq中没有groutineif len(ch) == 0 { // 如果现有数据量为0,跳出循环break}}close(ch)for i := range ch {fmt.Println(i)}}

生产者消费者

package mainimport ("fmt""sync""time"
)func producer(ch chan<- int) {defer wg.Done()for i := 1; i < 11; i++ {time.Sleep(time.Second)ch <- ifmt.Println("生产了:", i)}close(ch)
}func consumer(ch <-chan int) {defer wg.Done()for i := range ch {fmt.Println("消费了:", i)}
}var wg sync.WaitGroupfunc main() {ch := make(chan int, 100)wg.Add(2)go producer(ch)go consumer(ch)wg.Wait()fmt.Println("process end")
}

在这里插入图片描述

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

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

相关文章

vue 下拉框显示从后端请求的数据

下拉框<!-- 给产品添加推广人员弹出框 --><el-dialog :title"titlePerson" :visible.sync"openAddPerson" width"1000px" append-to-body><el-select v-model"this.bindingProductPerson.recommendId" filterable plac…

【C++】-list的具体使用

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

HTML学习 第一部分(前端学习)

参考学习网站: 网页简介 (w3schools.com) 我的学习思路是&#xff1a;网站实践视频。 视频很重要的&#xff0c;因为它会给你一种开阔思路的方式。你会想&#xff0c;噢&#xff01;原来还可以这样。这是书本或者网站教程 所不能教给你的。而且&#xff0c;对一些教程&#…

Ubuntu搭建docker+laradock

使用Ubuntu搭建dockerlaradock windows 下载Ubuntu工具二选一 链接&#xff1a;https://pan.baidu.com/s/154K6MKdFZxWqaTn2q-6MSQ 提取码&#xff1a;06lc https://www.jianshu.com/p/b7e11d0dbe8c借鉴地址&#xff1a;https://zhuanlan.zhihu.com/p/547169542 备注&#x…

没有人能真正精通C++

目录 1、C的“双峰”特性 2、没人能真正精通C 3、世界仍然需要C 任何说自己很懂C的人可能都是在夸大其词。 我想你可能已经注意到了&#xff0c;是的&#xff0c;今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C等古老的编…

微信加粉计数器后台开发

后台包括管理后台与代理后台两部分 管理后台 管理后台自带网络验证卡密系统,一个后台可以完成对Pc端的全部对接,可以自定义修改分组名称 分享等等代理后台 分享页 调用示例 <?php$request new HttpRequest(); $request->setUrl(http://xxxxxxx/api); $request->…

Spingboot 多模块引入第三方jar包

1. 在需要的模块中引入jar包 2. 在此模块中的pom.xml 中引用 3. 要想打包部署服务器&#xff0c;需要在启动模块中添加配置信息 ps&#xff1a;启动模块要引用此模块才能将此一起jar打包部署 <build><plugins><plugin><groupId>org.springframework.…

基于阿里云微信小程序语音识别

页面效果 其中采用阿里云语音识别&#xff1a;阿里云一句话语音识别 语音识别页面 <template><view><view class"chat_list"><view v-for"v in chatList" :class"v.type right ? type_right : type_left"><chat …

Nautilus Chain 更换全新测试网,主网即将在不久上线

目前&#xff0c;Nautilus Chain 正在为主网上线前的最后阶段做准备&#xff0c;据悉该链更新了全新的测试网&#xff0c;在此前版本的测试网的基础上进行了全新的技术升级&#xff0c;最新测试网版本与生态发展的技术规划更为贴近。本次测试网升级将会是最后一次测试网版本的迭…

MacOS上安装Portainer

Portainer介绍 Portainer 是一个很方便的 Docker 可视化管理工具。主要的功能包括: 管理 Docker 主机,可以添加和删除 Docker 主机管理容器,可以启动、停止、删除等容器管理镜像,可以搜索、拉取、删除镜像管理卷,可以查看、删除卷管理网络,可以创建 Docker 网络管理用户和角色…

Redis数据持久化

Redis数据持久化 redis一共提供了两种数据持久化的方式RDB和AOF。 RDB ​ RDB全称为Redis Database Backup file&#xff08;数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是将内存中的全部数据都记录到磁盘中&#xff0c;当redis发生宕机或是一些…

VSCode种git rebase分支冲突解决无法继续rebase

情景&#xff1a; 常规来说我们git开分支开发完新功能之后&#xff0c;提交之前rebase dev分支&#xff0c;然后合并到dev上算是开发完成。 问题还原&#xff1a; 在开发完之后执行如下指令&#xff1a; 1.执行变基操作&#xff1a;git rebase dev。 //这一步出现冲突vscode上…

微信小程序基于Promise封装发起网络请求

1.创建一个request.js // 相当于域名 const baseURL ***************; // 暴露一个request函数 export function request(parms) {// 路径拼接const url baseURL parms.url;// 请求体&#xff0c;默认为{}const data parms.data || {};// 请求方式&#xff0c;默认为GETco…

HTTPS详解

1 概述 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密&#xff0c;而加密过程是使用了非对称加密实现。但其实&#xff0c;HTTPS 在内容传输的加密上使用的是对称加密&#xff0c;非对称加密只作用在证书验证阶段。 2 HTTPS请求过程 HTTPS的整体过程分为…

【FAQ】API6低代码开发问题汇总

参考文档&#xff1a; 低代码开发参考文档&#xff1a; 文档中心:使用低代码进行开发 基于景区模板开发元服务&#xff1a; 文档中心:模板简介 使用API6低代码开发遇到的问题汇总情况如下&#xff1a; 1、低代码环境下&#xff0c;如何实现box-shadow阴影效果的配置&#…

Angular 调试工具(Augury)

目录 1、简介 2、检验代码 3、Angury 本地构建和安装 3.1 添加到Chrome 浏览器&#xff1a; 3.2 添加到Firefox浏览器 4、项目中对应的Npm脚本 5、Augury 三大主要功能 5.1 组件树&#xff08;Component Tree&#xff09; 5.1.1 Component Tree 5.2 路由树&#xff0…

带记忆的Transformer模块

MEMORIZING TRANSFORMERS 返回论文和资料目录 论文地址 1.导读 谷歌去年做的一个工作。内容很简单&#xff0c;在Transformer模块中加入了一层记忆层&#xff0c;结果表明这个方法可以帮助模型提高在NLP任务上的表现&#xff1a;generic webtext (C4), math papers (arXiv),…

Generative Adversarial Network

Goodfellow,2014年 文献阅读笔记--GAN--Generative Adversarial NetworkGAN的原始论文-组会讲解_gan英文论文_Flying Warrior的博客-CSDN博客 启发:如何看两个数据是否来自同一个分布? 在统计中,two sample test。训练一个二分类的分类器,如果能分开这两个数据,说明来自…

数据库复习

select 查询 字段别名用 as (可以为中文) 例如 select distinct 关键字 去重复值 例如select distinct deptno from test where 条件过滤 and or 和 not运算符 and同时成立 or有一个成立就可以了 优先级and>or>not不符合&#xff08;!&#xff09; in 匹配多个值 selec…

Windows上查看服务器上tensorboad内容

文章目录 前言一、SSH的设置二、tensorboard命令 前言 本篇文章是针对于局域网内的服务器的tensorboard可视化&#xff0c;由于设置方式稍微有点复杂&#xff0c;导致我每次隔了一段时间之后&#xff0c;就不知道该怎么查看tensorboard了&#xff0c;每次都要百度搜一大堆资料…