本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/4.1-goroutine/”
以前我们写并发的程序一般是用多线程来实现,自己维护一个线程池,在恰当的时候创建、销毁、分配资源。
go 在并发方面为我们提供了一个语言级别的支持, goroutine 和 chan 相互配合,这决定了他的先天优势。
goroutine 的概念类似于线程, Go 程序运行时会自动调度和管理,系统能智能地将 goroutine 中的任务合理地分配给 CPU , 让这些任务尽量并发运作。
创建一个 goroutine ,只需要在函数前加一个 go 关键字就成了。
- go 函数名(参数)
看一个 dome
- func quickFun(){
- fmt.Println("maybe you can's see me!")
- }
- func main(){
- go quickFun() // 创建了一个 goroutine
- fmt.Println("hey")
- time.Sleep(time.Second)
- }
输出
- hey
- maybe you can's see me!
对,就是这么简单,如果你的函数只在这里使用,也可以用匿名函数来创建 goroutine 。
- func main(){
- go func() {
- fmt.Println("hello ")
- }()
- time.Sleep(time.Second) //main运行结束会暴力终止所有协程,所以这里先等待1秒
- }
PS: 和线程不同,goroutine没有唯一的id,所以我们没办法专门q针对某个协程进行操作。
goroutine 是 Go 语言并行设计的核心。goroutine 是一种比线程更轻量的实现,十几个 goroutine 可能在底层就是几个线程。实际上是 Go 在 runtime、系统调用等多方面对 goroutine 调度进行了封装和处理。
使用 goroutine 只需要简单的在需要执行的函数前添加 go 关键字即可。当执行 goroutine 时候,Go 语言立即返回,接着执行剩余的代码,不会阻塞主线程。
下面我们通过一小段代码来讲解 go 的使用:
- //首先我们先实现一个 Add()函数
- func Add(a, b int) {
- c := a + b
- fmt.Println(c)
- }
- go Add(1, 2) //使用go关键字让函数并发执行
Go 的并发执行就是这么简单,当在一个函数前加上 go 关键字,该函数就会在一个新的 goroutine 中并发执行,当该函数执行完毕时,这个新的 goroutine 也就结束了。不过需要注意的是,如果该函数具有返回值,那么返回值会被丢弃。所以什么时候用 go 还需要酌情考虑。
接着我们通过一个案例来体验一下 Go 的并发到底是怎么样的。新建源文件 goroutine2.go,输入以下代码:
- package main
- import "fmt"
- func Add(a, b int) {
- c := a + b
- fmt.Println(c)
- }
- func main() {
- for i := 0; i < 10; i++ {
- go Add(i, i)
- }
- }
执行 goroutine.go 文件会发现屏幕上什么都没有,但程序并不会报错,这是什么原因呢?
原来当主程序执行到 for 循环时启动了 10 个 goroutine,然后主程序就退出了,而启动的 10 个 goroutine 还没来得及执行 Add() 函数,所以程序不会有任何输出。也就是说主 goroutine 并不会等待其他 goroutine 执行结束。
Go 语言提供的信道(channel)就是专门解决并发通信问题的,下一节我们将详细介绍。
学 go 语言必学并发,通过本节我们知道了协程是非常容易创建的,而且他非常轻量只占用 4k,其他语言很容易就上MB
协程的使用还要配合数据传输,生产者消费者模型,关于协程的调度,我们后续再说。
另外并发 bug 的定位和解决是老大难的问题了,平时就要注意的良好的代码风格和编程习惯。
本文转载自微信公众号「机智的程序员小熊」,可以通过以下二维码关注。转载本文请联系机智的程序员小熊公众号。
标题名称:Go语言中的并发特性
网站网址:http://www.shufengxianlan.com/qtweb/news36/385286.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联