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的更多相关文章

  1. Golang开发支持平滑升级(优雅重启)的HTTP服务

    Golang开发支持平滑升级(优雅重启)的HTTP服务 - tabalt的博客 http://tabalt.net/blog/graceful-http-server-for-golang/ http ...

  2. 使用golang 开发的 andriod应用

    最近在捣鼓一个东东,就是使用golang开发andriod应用.说起来简单操作起来还挺麻烦,中间又学习了很多东西.比如ubuntu,docker,angular,ionic,jquery mobile ...

  3. golang开发android环境搭建_window

    golang开发android环境搭建介绍 一 安装依赖软件: git:版本管理 go:  go开发环境(版本>=1.5),可直接下载window版的go安装包. android studio: ...

  4. Windows下visual studio code搭建golang开发环境

    Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...

  5. linux golang开发环境配置(离线方式)

    <获取开发工具>     到https://www.golangtc.com/download 下载安装包, 根据自己的系统选择合适的开发包,这里选择go.1.9.2.linux-amd6 ...

  6. miniblink+golang开发windows gui应用

    golang的优点自不必说了,这么好的语言怎么能缺少界面库呢?所以我使用miniblink开发了一个可以用html,css,js开发界面的浏览器,通过它你能为你的golang开发简单的界面.说白了其实 ...

  7. Linux下golang开发环境搭建

    对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...

  8. window / Linux 下 Golang 开发环境的配置

    一直专注于使用python语言进行程序开发,但是却又一直被它的性能问题所困扰,直到遇到了天生支持高并发的Golang,这似乎也成了学习go语言最理所当然的理由.下面介绍下Go语言开发环境搭建的步骤: ...

  9. Golang开发环境搭建-Vim篇

    一.一个干净的环境 找个干净的基础环境,方便确认每个搭建步骤后的效果: Ubuntu 14.04 x86_64 vim version 7.4.52 go version go1.4beta1 lin ...

  10. Visual Studio Code配置GoLang开发环境

    Visual Studio Code配置GoLang开发环境 在Visual Studio Code配置GoLang开发环境 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页: ...

随机推荐

  1. 2014 NOIP 赛前自我整理提醒。

    空谈WA,实干AC. 所以作为一个就要上战场的OIer ,实干当然是最重要,但刷题不在多,要点牢记是关键,虽然本渣没记住多少,但还是列几点值得注意的小点. 1.战场上容不得失误. 对于每日都要敲键盘的 ...

  2. h5弹框去掉ip地址

    <script> window.alert = function(name){ var iframe = document.createElement("IFRAME" ...

  3. php安装libiconv-1.14.tar.gz遇到的问题

    遇到的Error code In file included from progname.c:26:0: ./stdio.h:1010:1: error: ‘gets‘ undeclared here ...

  4. 4)Java容器类相关知识

    1>Array 和 Arrays:   Arrays:用来操作array的工具类,其中包含一组static函数:      equals():比较两个array 是否相等. array拥有相同元 ...

  5. 【Android车载系统 News | Tech 2】News 谷歌开发新车载系统!安卓Auto不是终点 2014-12-20

    Google在今年推出了车载安卓系统Android Auto,旨在为汽车提供娱乐.导航等功能.不过,Android Auto并不是终点,现在有消息报道,Google正在开发一个能够彻底取代汽车底层控制 ...

  6. dom 规划(html和xml)

    html dom与xml dom关联: 什么是 DOM? DOM 是 W3C(万维网联盟)的标准. DOM 定义了訪问 HTML 和 XML 文档的标准: "W3C 文档对象模型 (DOM) ...

  7. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  8. Oracle RAC环境下定位并杀掉最终阻塞的会话-续

    之前在<Oracle RAC环境下定位并杀掉最终阻塞的会话>中,最终使用一个SQL查询出RAC实例之间的所有阻塞关系.但是实际在某些极端的生产环境,是不允许执行复杂的SQL语句,即使允许执 ...

  9. 第1章 发现端点(Discovery Endpoint) - IdentityModel 中文文档(v1.0.0)

    OpenID Connect发现端点的客户端库作为httpclient的扩展方法提供.该GetDiscoveryDocumentAsync方法返回一个DiscoveryResponse对象,该对象具有 ...

  10. python的进程与线程(二)

    线程 之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是:         进程:本质上就是一段程序的运行过程(抽象的概念)         线程:最小的执行单元,是进程的实体     ...