1. 概念

go中可以并发执行的活动单元称为goroutine
当一个go程序启动时,一个执行main function的goroutine会被创建,称为main goroutine
go func() 使用go语句开启一个新的goroutine之后,go语句之后的函数调用将在新的goroutine中执行, 并且不会阻塞当前程序的运行
goroutine是实际并发的实体,两个实体之间通过channel来实现数据的共享
goroutine底层是使用coroutine实现并发,
golang使用goroutine做为最小的执行单位,这个执行单位还是在用户空间,实际最后被处理器执行的还是内核中的线程
goroutine本质上是协程,不受内核调度,由go的调度器来调度

2. goroutine是异步执行,就有可能导致主程序执行完退出时还有goroutine还没有执行完,此时goroutine也会跟着退出
此时如果想等到所有goroutine任务执行完毕才退出,go提供了sync包解决同步问题
package main

import (
"fmt"
"sync"
"time"
) func add(n1, n2 int, g *sync.WaitGroup) {
time.Sleep(time.Second)
fmt.Println(n1 + n2)
defer g.Done() // goroutine完成后,WaitGroup的计数-1
} func main() {
var goSync sync.WaitGroup
goSync.Add(1) // WaitGroup的计数+1
go add(11, 22, &goSync)
goSync.Wait() // 等待所有goroutine执行完毕
fmt.Println("结束了")
}

 channel 也可以解决同步问题

package main

import "time"

func worker(c chan bool) {
time.Sleep(time.Second * 2)
c <- true
} func main() {
done := make(chan bool)
go worker(done)
<-done // 等待接收通道中的数据
}

  

 

golang中的goroutine的更多相关文章

  1. Golang之chan/goroutine(转)

    原文地址:http://tchen.me/posts/2014-01-27-golang-chatroom.html?utm_source=tuicool&utm_medium=referra ...

  2. golang中的race检测

    golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...

  3. Golang 探索对Goroutine的控制方法

    前言 在golang中,只需要在函数调用前加上关键字go即可创建一个并发任务单元,而这个新建的任务会被放入队列中,等待调度器安排.相比系统的MB级别线程栈,goroutine的自定义栈只有2KB,这使 ...

  4. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  5. golang中Context的使用场景

    golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...

  6. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  7. [译]Golang中的优雅重启

    原文 Graceful Restart in Golang 作者 grisha 声明:本文目的仅仅作为个人mark,所以在翻译的过程中参杂了自己的思想甚至改变了部分内容,其中有下划线的文字为译者添加. ...

  8. golang 中 channel 的非阻塞访问方法

    在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例: 即只要在select中加入default,阻塞立即变成非阻塞: package main import ...

  9. golang 中 sync包的 WaitGroup

    golang 中的 sync 包有一个很有用的功能,就是 WaitGroup 先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 ...

随机推荐

  1. Hibernate 限制查询数目,使用limit功能

    在hql语句中,不能使用limit来限制显示的条数. 如果要限制查询的数目,要使用setMaxResults(e)方法来解决. query.setFirstResult(e);  //e是int值,要 ...

  2. MySQL设置表中字段的数据唯一性

    mysql设置数据库表里的某个字段的数据是唯一的 ALTER TABLE 表名 ADD unique(`表中的字段`)

  3. JS代码日期格式化

    function dateConvert(format,value) { var date = new Date(value); var o = { "M+" : date.get ...

  4. MacOS设置终端代理

    前言 国内的开发者或多或少都会因为网络而烦恼,因为一些特殊原因有时候网络不好的时候需要使用代理才能完成对应的操作.原来我一直都是使用斐讯路由器然后刷了梅林的固件,直接在路由器层面设置转发代理,把一些国 ...

  5. [LeetCode] 729. My Calendar I 731. My Calendar II 732. My Calendar III 题解

    题目描述 MyCalendar主要实现一个功能就是插入指定起始结束时间的事件,对于重合的次数有要求. MyCalendar I要求任意两个事件不能有重叠的部分,如果插入这个事件会导致重合,则插入失败, ...

  6. spoj-SUBSUMS - Subset Sums

    SUBSUMS - Subset Sums Given a sequence of N (1 ≤ N ≤ 34) numbers S1, ..., SN (-20,000,000 ≤ Si ≤ 20, ...

  7. 【剑指Offer】滑动窗口的最大值 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 暴力求解 单调递减队列 日期 题目地址:https://www ...

  8. KMM

    目录 概 主要内容 Huang J., Smola A., Gretton A., Borgwardt K. & Scholkopf B. Correcting Sample Selectio ...

  9. EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES

    目录 概 主要内容 从线性谈起 非线性 Goodfellow I, Shlens J, Szegedy C, et al. Explaining and Harnessing Adversarial ...

  10. 漫谈grpc 3:从实践到原理,带你参透 gRPC

    ​ 原文链接:万字长文 | 从实践到原理,带你参透 gRPC 大家好,我是煎鱼. gRPC 在 Go 语言中大放异彩,越来越多的小伙伴在使用,最近也在公司安利了一波,希望这一篇文章能带你一览 gRPC ...