Go并发编程基础

Go并发编程基础

ID:46611818

大小:77.50 KB

页数:9页

时间:2019-11-26

Go并发编程基础_第1页
Go并发编程基础_第2页
Go并发编程基础_第3页
Go并发编程基础_第4页
Go并发编程基础_第5页
资源描述:

《Go并发编程基础》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Go并发编程基础本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖:运行期并发线程(coroutines)基本的同步技术(管道和锁)Go语言中基本的并发模式死锁和数据竞争并行计算在开始阅读本文之前,你应该知道如何编写简单的Go程序。如果你熟悉的是C/C++、Java或Python之类的语言,那么Go语言之旅能提供所有必要的背景知识。也许你还有兴趣读一读为C++程序员准备的Go语言教程或为Java程序员准备的Go语言教程。Go允许使用go语句开启一个新的运行期线程,即goroutine,以一个不同的

2、、新创建的goroutine来执行一个函数。同一个程序中的所有goroutine共享同一个地址空间。Goroutine非常轻量,除了为之分配的栈空间,其所占用的内存空间微乎其微。并且其栈空间在开始时非常小,之后随着堆存储空间的按需分配或释放而变化。内部实现上,goroutine会在多个操作系统线程上多路复用。如果一个goroutine阻塞了一个操作系统线程,例如:等待输入,这个线程上的其他goroutine就会迁移到其他线程,这样能继续运行。开发者并不需要关心/担心这些细节。下面所示程序会输出“Hellofrom

3、maingoroutine”。也可能会输出“Hellofromanothergoroutine^,具体依赖于两个goroutine哪个先结束。接下来的这个程序,多数情况下,会输出“Hellofrommaincoroutine”和Hellofromanothergoroutine输出的顺序不确定。但还有另一个可能性是:第二个goroutine运行得极其慢,在程序结束之前都没来得及输出相应的消息。下面则是一个相对更加实际的示例,其中定义了一个函数使用并发来推迟触发一个事件。你可能会这样使用Publish函数:这个程序

4、,绝大多数情况下,会输出以下三行,顺序固定,每行输出之间相隔5秒。一般来说,通过睡眠的方式来编排线程之间相互等待是不太可能的。下一章节会介绍G。语言中的一种同步机制-管道,并演示如何使用管道让一个goroutine等待另一个goroutine。2.管道(channel)管道是Go语言的一个构件,提供一种机制用于两个goroutine之间通过传递一个指定类型的值来同步运行和通讯。操作符<■用于指定管道的方向,发送或接收。如果未指定方向,则为双向管道。管道是引用类型,基于make函数来分配。如果通过管道发送一个

5、值,则将<■作为二元操作符使用。通过管道接收一个值,则将其作为一元操作符使用:如果管道不带缓冲,发送方会阻塞直到接收方从管道中接收了值。如果管道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。关闭管道(Close)close函数标志着不会再往某个管道发送值。在调用close之后,并且在之前发送的值都被接收后,接收操作会返回一个零值,不会阻塞。一个多返回值的接收操作会额外返回一个布尔值用来指示返回的值是否发送操

6、作传递的。一个带有range了句的for语句会依次读取发往管道的值,直到该管道关闭:2.同步下一个示例中,我们让Publish函数返回一个管道-用于在发布text变量值时广播一条消息:注意:我们使用了一个空结构体的管道:struct*这明确地指明该管道仅用于发信号,而不是传递数据。我们可能会这样使用这个函数:这个程序会按指定的顺序输出以下三行内容。最后一行在新闻(news)一出就会立即输出。3.死锁现在我们在Publish函数中引入一个bug:主程序还是像之前一样开始运行:输出第一行,然后等待5秒,这时Publi

7、sh函数开启的goroutine会输出突发新闻(breakingnews),然后退出,留下主goroutine独白等待。此刻之后,程序无法再继续往下执行。众所周知,这种情形即为死锁。Go语言对于运行时的死锁检测具备良好的支持。当没有任何goroutine能够往前执行的情形发生时,Go程序通常会提供详细的错误信息。以下就是我们的问题程序的输出:大多数情况下找出Go程序中造成死锁的原因都比较容易,那么剩下的就是如何解决这个bug了o2.数据竞争(datarace)死锁也许听起来令人挺忧伤的,但伴随并发编程真正灾难性的

8、错误其实是数据竞争,相当常见,也可能非常难于调试。下面的这个函数就有数据竞争问题,其行为是未定义的。例如,可能输出数值1。代码之后是一个可能性解释,试图搞清楚这一切是如何发生得。代码中的两个goroutine(假设命名为gl和g2)参与了一次竞争,我们无法获知操作会以何种顺序发生。以下是诸多可能中的一种:凯从n中获取值0g2从n中获取值0型将值从0增大到lgl将1写到ng

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。