Goroutine

goroutine是Go并行设计的核心。goroutine说到底其实就是协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。goroutine比thread更易用、更高效、更轻便。

一般情况下,一个普通计算机跑几十个线程就有点负载过大了,但是同样的机器却可以轻松地让成百上千个goroutine进行资源竞争。

Goroutine的创建

只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行。

并发编程中,我们通常想将一个过程切分成几块,然后让每个goroutine各自负责一块工作,当一个程序启动时,主函数在一个单独的goroutine中运行,我们叫它main goroutine。新的goroutine会用go语句来创建。而go语言的并发设计,让我们很轻松就可以达成这一目的。

下面以代码示例看看携程的简单用法

package mainimport ("fmt""time"
)func task1(ch chan <- struct{}) {fmt.Println("任务1耗时3s")//fmt.Println(time.Now().Format("2006-01-02 15:04:05"))time.Sleep(time.Second * 3)//1任务完成ch <- struct{}{}}
func task2(ch chan <- struct{})  {fmt.Println("任务2耗时2s")time.Sleep(time.Second *2)//2任务完成ch <- struct{}{}
}
func main() {fmt.Println("两个耗时任务开始")startTime := time.Now()fmt.Println(startTime.Format("2006-01-02 15:04:05"))//每次完成任务往ch管道中写空结构体ch := make(chan struct{})count := 2 // count 表示总任务的个数go task1(ch)//其他任务go task2(ch)for range ch{// 每次从ch中接收数据,表明一个任务的协程结束count--// 当所有活动的协程都结束时,关闭管道if count == 0 {//总共耗时finishTime := time.Now()d := finishTime.Sub(startTime)fmt.Println("总耗时")fmt.Println(d)close(ch)}}
}

执行结果:
两个耗时任务开始
2020-08-10 17:19:44
任务2耗时2s
任务1耗时3s
总耗时
3.0117613s

Goroutine特性

主goroutine退出后,其它的工作goroutine也会自动退出:

package mainimport ("fmt""time"
)func newTask() {i := 0for {i++fmt.Printf("new goroutine: i = %d\n", i)time.Sleep(1 * time.Second) //延时1s}
}func main() {//创建一个 goroutine,启动另外一个任务go newTask()fmt.Println("main goroutine exit")
}

执行结果:
main goroutine exit

卷毛0基础学习Golang-并发编程-02 Goroutine相关推荐

  1. 卷毛0基础学习Golang-并发编程,01 什么是并发

    卷毛0基础学习Golang-并发编程,什么是并发 Go并发编程 概述 简而言之,所谓并发编程是指在一台处理器上"同时"处理多个任务. 随着硬件的发展,并发程序变得越来越重要.Web ...

  2. 卷毛0基础学习Golang-并发编程-03 channel管道

    channel channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度. channel是一个数据类型,主 ...

  3. 卷毛0基础学习Golang-基础-slice切片

    卷毛0基础学习Golang-基础-slice切片 持续更新中---- 切片简述 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数据结构无法完全满足开发者的真实需求. ...

  4. 0基础学习网页结构编程

    ①首先我们要在电脑上安装一个网页的编程平台,建议大家使用VSCode,这个软件使用起来很方便,比较适合初学者. ②完成软件的安装后需要在软件内安装几个扩展包方便后续编程,如Chinese Langua ...

  5. ​Golang 并发编程指南

    分享 Golang 并发基础库,扩展以及三方库的一些常见问题.使用介绍和技巧,以及对一些并发库的选择和优化探讨. go 原生/扩展库 提倡的原则 不要通过共享内存进行通信;相反,通过通信来共享内存. ...

  6. 0基础学习数据分析必须掌握的技能有哪些?

    现如今,我们处于一个互联网发展的时代,大大小小的企业对于数据分析相关岗位的需求逐渐增加,因为所有的企业都有数据,企业需要让数据分析师通过整理.分析企业数据总结出企业目前的发展现状,并且为企业做出下一步 ...

  7. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

  8. 如何学习Java并发编程

    只要从事JAVA开发的小伙伴们,都会或多或少地接触到并发编程.对于初学者来说,这一部分内容比较晦涩难懂,并且嵌入了很多新技术.本篇博文旨在为小伙伴们提供学习Java并发编程的指导性建议.当然,这仅仅是 ...

  9. 从0基础学习Python(13)[面向对象思想]

    从0基础学习Python (Day13) 面向对象思想 1.面向对象编程介绍 面向对象 概述 ​ 目前软件开发技术中两种主流思想:面向过程.面向对象 ​ 面向过程思想出现较早,C语言 ​ 面向对象思想 ...

最新文章

  1. 田志刚:要你共享,但不告诉你共享什么
  2. wxWidgets:wxResourceTranslationsLoader类用法
  3. 按钮旁边加一个提示_地铁站的那些“红色按钮”,你知道是干啥用的吗?乱按可能被拘留...
  4. java filter教程_Java Web Filter 过滤器学习教程(推荐)
  5. linux监控http连接数,zabbix监控linux tcp连接数
  6. stc和sac_短期成本曲线
  7. 冒险岛无敌外挂代码诠释
  8. 2019年PAT甲级冬季考试真题及参考答案
  9. 关于新版本Firefox浏览器无法使用firebug与firepath问题的解决方案
  10. 使用java实现MD5码算法
  11. 23Bootstrap
  12. Jira Seraph 中的身份验证绕过漏洞(CVE-2022-0540)
  13. 基于微信实现H5扫一扫功能详细过程
  14. js josn prase
  15. 新股发行密集时重视申购技巧
  16. Springboot 结合 Vue 进行本地接口联调
  17. ios王者荣耀服务器维护31号,王者荣耀iOS还在维护怎么回事 3月31日王者荣耀IOS什么时候能上...
  18. ColBERT(2020SIGIR)
  19. ora-28040解决方法
  20. 11月钓鱼网站简报:阿里巴巴占比居首 新网次之

热门文章

  1. IBM启动2014三大战略方向
  2. V2V Data Offloading for Cellular Network Based on the SDN Inside MEC Architecture 学习笔记
  3. strong_alias、weak_alias
  4. DNS中的SPF记录
  5. android 床头闹钟,史上最强"叫床"闹钟!让你再也睡不着啦~~(支持 Android)
  6. Android动态修改icon--让你的app浪起来
  7. leetcode-004-0811. 硬币
  8. mac必备的文件管理器:Path Finder Mac中文版
  9. 面试官都爱问的java模式之建造者模式!!!
  10. scsi和iscsi区别