golang开发:CSP-WaitGroup Mutex
CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,最初于Tony Hoare的1977年的论文中被描述,影响了许多编程语言的设计。
golang CSP模型
golang语言并没有完全实现了CSP模型的所有理论,仅仅是借用了 process和channel这两个概念。process是在golang语言上的表现就是 goroutine, 是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。
最经典的数据通信共享理论
以通信的方式来共享内存
Do not communicate by sharing memory; instead, share memory by communicating
不要以共享内存的方式来通信,相反,要通过通信来共享内存。
这是golang实现高并发的基础通信理论。
在golang语言上面,就是通过channel实现多个goroutine的数据通信。
sync.WaitGroup使用
如果需要让多个goroutine都执行完成,就是用使用time.sleep,延迟几秒保证每个goroutine都能执行到。
func testPrint(i int) {
fmt.Println(i)
}
func main() {
for i:=0;i<5;i++ {
go testPrint(i)
}
time.Sleep(time.Second)
}
但是在生产项目里面就没法这么写了,延迟1S有可能所有goroutine没执行完成,延迟1000S可能1毫秒就执行完了,其他999S都是等待,延长了程序执行时间。
所以就有sync.WaitGroup
func testPrint(wg *sync.WaitGroup, i int) {
fmt.Println(i)
wg.Done()
}
func main() {
var wg = new(sync.WaitGroup)
for i:=0;i<5;i++ {
wg.Add(1)
go testPrint(wg,i)
}
wg.Wait()
}
WaitGroup比较容易理解,其实就是一个内部计数器,在执行goroutine行为之前执行 wg.Add(1),给计数器+1,执行完之后,执行wg.Done(),表示这个goroutine执行完成,计数器内部-1,wg.Wait()会阻塞代码的运行,等待所有的添加进WaitGroup的goroutine全部执行完毕(计数器减为0),再退出程序。
非常完美的解决了等待所有goroutine执行完毕的需要。
sync.Mutex
sync.Mutex,互斥锁排它锁。
我们需要维护一个变量,保证每个goroutine都能成功的修改它,如果没有互斥锁可能就是下面的代码
func testPrint(wg *sync.WaitGroup, i int) {
count++
fmt.Println(i)
wg.Done()
}
var count int
func main() {
count = 0
var wg = new(sync.WaitGroup)
for i:=0;i<500;i++ {
wg.Add(1)
go testPrint(wg,i)
}
wg.Wait()
fmt.Printf("count:%d",count)
}
预期应该是特定的值,500,其实经常性的不是500.就是因为多个goroutine同时去修改count值了,加上互斥锁试一下。
func testPrint(wg *sync.WaitGroup, i int) {
defer func() {
mu.Unlock()
}()
mu.Lock()
count++
fmt.Println(i)
wg.Done()
}
var count int
var mu *sync.Mutex
func main() {
count = 0
mu = new(sync.Mutex)
var wg = new(sync.WaitGroup)
for i:=0;i<500;i++ {
wg.Add(1)
go testPrint(wg,i)
}
wg.Wait()
fmt.Printf("count:%d",count)
}
结果是定值500,跟预想的一致。
golang开发:CSP-WaitGroup Mutex的更多相关文章
- Golang开发支持平滑升级(优雅重启)的HTTP服务
Golang开发支持平滑升级(优雅重启)的HTTP服务 - tabalt的博客 http://tabalt.net/blog/graceful-http-server-for-golang/ http ...
- 使用golang 开发的 andriod应用
最近在捣鼓一个东东,就是使用golang开发andriod应用.说起来简单操作起来还挺麻烦,中间又学习了很多东西.比如ubuntu,docker,angular,ionic,jquery mobile ...
- golang开发android环境搭建_window
golang开发android环境搭建介绍 一 安装依赖软件: git:版本管理 go: go开发环境(版本>=1.5),可直接下载window版的go安装包. android studio: ...
- Windows下visual studio code搭建golang开发环境
Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...
- linux golang开发环境配置(离线方式)
<获取开发工具> 到https://www.golangtc.com/download 下载安装包, 根据自己的系统选择合适的开发包,这里选择go.1.9.2.linux-amd6 ...
- miniblink+golang开发windows gui应用
golang的优点自不必说了,这么好的语言怎么能缺少界面库呢?所以我使用miniblink开发了一个可以用html,css,js开发界面的浏览器,通过它你能为你的golang开发简单的界面.说白了其实 ...
- Linux下golang开发环境搭建
对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...
- window / Linux 下 Golang 开发环境的配置
一直专注于使用python语言进行程序开发,但是却又一直被它的性能问题所困扰,直到遇到了天生支持高并发的Golang,这似乎也成了学习go语言最理所当然的理由.下面介绍下Go语言开发环境搭建的步骤: ...
- Golang开发环境搭建-Vim篇
一.一个干净的环境 找个干净的基础环境,方便确认每个搭建步骤后的效果: Ubuntu 14.04 x86_64 vim version 7.4.52 go version go1.4beta1 lin ...
- Visual Studio Code配置GoLang开发环境
Visual Studio Code配置GoLang开发环境 在Visual Studio Code配置GoLang开发环境 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页: ...
随机推荐
- golang 的 string包
前言 不做文字搬运工,多做思路整理 就是为了能速览标准库,只整理我自己看过的...... 注意!!!!!!!!!! 单词都是连着的,我是为了看着方便.理解方便才分开的 1.string 中文文档 [英 ...
- 更优雅的配置:docker/运维/业务中的环境变量
目录 docker-compose 环境变量 .env 文件 env_file docker stack 不支持基于文件的环境变量 envsubst envsubst.py 1. 使用行内键值对 2. ...
- VMware Workstation 15 Pro安装带图形化界面的CentOS7
1.双击打开“VMware Workstation”,然后选择“创建新的虚拟机” 2.在安装向导中,选择“稍后安装操作系统”,然后点击“下一步”继续安装 3.在“客户机操作系统”中选择“Linux(L ...
- 用WEB方式开发WPF桌面程序
因为疫情影响,公司裁员,结束了一年多的web开发经历,重新开始做桌面,新公司用的是WPF(居然用的是winform style...),当然这跟本文没有关系...上篇博客写的用后台api和前台浏览器控 ...
- python接口自动化 - 断言(上)
我们在做接口自动化的时候会用当unittest框架,这个框架中是有assert方法 当我们写好我们的case后 总要有个验证是否正确的东西,assert就给我们提供了非常强大的结果验证 序号 断言方法 ...
- C++置换的玩笑
小蒜头又调皮了.这一次,姐姐的实验报告惨遭毒手. 姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔.但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 ...
- Linux三剑客老三---grep
1.Linux三剑客老三 过滤需要的内容,例子:grep -v oldboy hello.txt grep一般常用参数: -a:在二进制文件中,以文本文件的方式搜索数据. -c:计算找到"搜 ...
- JavaScript学习系列博客_8_JavaScript中的关系运算符、赋值运算符
关系运算符 - 关系运算符用来比较两个值之间的关系的 >.<.<=.>= 先说这四个.如果关系成立则返回true,关系不成立则返回false. - 如果比较的两个值是非numb ...
- 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...
- 多线程系列(二)之Thread类
在上一遍文章中讲到多线程基础,在此篇文章中我们来学习C#里面Thread类.Thread类是在.net framework1.0版本中推出的API.如果对线程的概念还不太清楚 的小伙伴请阅读我的上一遍 ...