博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang 笔记 5 go语句
阅读量:6946 次
发布时间:2019-06-27

本文共 1717 字,大约阅读时间需要 5 分钟。

   Go语句和通道类型是Go语言的并发编程理念的最终体现。与defer语句相同,go语句也可以携带一个表达式语句。Go语句的执行会很快结束,并不会对当前流程的进行造成阻塞或明显的延迟。一个简单的示例:

go fmt.Println("Go")

  go语句仅由一个go关键字和一条表达式语句组成。同样的,go语句的执行与其携带的表达式语句的执行在时间上没有必然联系。这里能确定的仅仅是后者会在前者完成之后发生。在go语句被执行时,其携带的函数(也称为go函数)以及要传给它的若干参数会被封装成一个实体(即Goroutine),并被放入到相应的待运行队列中。Go语言的运行时系统会适时的从队列中取出待运行的Goroutine并执行相应的函数调用操作。注意,对传递给这里的函数的那些参数的求值会在go语句被执行时进行。

  正是由于go函数的执行时间的不确定性。所以Go提供了很多方法来协调它们的运行。其中最简单粗暴的方法就是time.Sleep函数:

package mainimport {    "fmt"}func main() { go fmt.Println("Go!") }

  上面的代码运行时,不会有任何输出,因为还没等go语言运行时系统调用那个go函数执行主函数main就已经执行完毕了。函数main的执行完毕意味着整个程序的执行的结束。因此,这个go函数就不会执行。

  当我们在上述go语句的后面添加一条对time.Sleep函数的调用语句之后情况就不同了:

package mainimport {    "fmt"    "time"}func main() { go fmt.Println("Go!") time.Sleep(100 * time.Millisecond) }

  语句time.Sleep(100 * time.Millisecond)会把main函数的执行结束时间向后延迟100毫秒,这样go函数就会被调度执行了。

  另外比较优雅的做法是在main函数的最后调用runtime.Gosched函数:

package mainimport {    "fmt"    "runtime"}func main() { go fmt.Println("Go") runtime.Gosched() }

  runtime.Gosched函数的作用是让当前正在运行的Goroutine(这里是运行main函数的那个Goroutine)暂时“休息”一下,而让Go运行时系统转去运行其他的Goroutine(这里是与go fmt.Println("Go!"))对应并会封装fmt.Println("Go!")的那个Goroutine)。

  还有另外的方法可以满足上述需求。如果我们要控制更多的Goroutine的运行时机的话,下面的方法更好:

package mainimport {    "fmt"    "sync"}func main() { var wg sync.WaitGroup wg.Add(3) go func () { fmt.Println("Go!") wg.Done() }() go func() { fmt.Println("Go!") wg.Done() }() go func() { fmt.Println("Go!") wg.Done() }() wg.Wait() }

  sync.WaitGroup类型有三个方法可用--Add、Done和Wait。Add会使其所属值的一个内置整数得到相应增加,Done会使那个整数减1,而wait方法会使当前Goroutine阻塞直到那个整数为0。上例中,我们在main函数中启用了三个Goroutine来封装三个Go函数。每个匿名函数的最后都调用了wg.Done方法。并以此表达当前的go函数会立即执行结束的情况。当这三个go函数都调用过wg.Done函数之后,处于main函数最后的那条wg.Wait()语句就不会阻塞,main函数的执行将立即结束。

转载于:https://www.cnblogs.com/orlion/p/6596523.html

你可能感兴趣的文章
InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...
查看>>
MVC插件实现
查看>>
Swift学习笔记1---变量和元组
查看>>
FTP权限问题解析,553 Can't open that file: Permission denied
查看>>
阿里云服务器重置后远程链接失败的解决办法
查看>>
POJ 3159 差分约束
查看>>
初始化参数绑定——日期格式
查看>>
python 基础 10.0 nosql 简介--redis 连接池及管道
查看>>
【SP1811】 LCS - Longest Common Substring(SAM)
查看>>
Backup: Array in Perl6
查看>>
ansible常用模块
查看>>
【C++】typeinfo.h
查看>>
Asp.net使用powershell管理hyper-v
查看>>
ASP.NET(C#)图片加文字、图片水印(转)
查看>>
python 爬虫
查看>>
连接ssh反应很慢,卡,延迟
查看>>
rabbitmq基本操作
查看>>
疑问????
查看>>
Leetcode 515. Find Largest Value in Each Tree Row
查看>>
WINCE 下载地址(转)
查看>>