卷毛0基础学习Golang-并发编程-02 Goroutine
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相关推荐
- 卷毛0基础学习Golang-并发编程,01 什么是并发
卷毛0基础学习Golang-并发编程,什么是并发 Go并发编程 概述 简而言之,所谓并发编程是指在一台处理器上"同时"处理多个任务. 随着硬件的发展,并发程序变得越来越重要.Web ...
- 卷毛0基础学习Golang-并发编程-03 channel管道
channel channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度. channel是一个数据类型,主 ...
- 卷毛0基础学习Golang-基础-slice切片
卷毛0基础学习Golang-基础-slice切片 持续更新中---- 切片简述 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数据结构无法完全满足开发者的真实需求. ...
- 0基础学习网页结构编程
①首先我们要在电脑上安装一个网页的编程平台,建议大家使用VSCode,这个软件使用起来很方便,比较适合初学者. ②完成软件的安装后需要在软件内安装几个扩展包方便后续编程,如Chinese Langua ...
- Golang 并发编程指南
分享 Golang 并发基础库,扩展以及三方库的一些常见问题.使用介绍和技巧,以及对一些并发库的选择和优化探讨. go 原生/扩展库 提倡的原则 不要通过共享内存进行通信;相反,通过通信来共享内存. ...
- 0基础学习数据分析必须掌握的技能有哪些?
现如今,我们处于一个互联网发展的时代,大大小小的企业对于数据分析相关岗位的需求逐渐增加,因为所有的企业都有数据,企业需要让数据分析师通过整理.分析企业数据总结出企业目前的发展现状,并且为企业做出下一步 ...
- python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...
从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...
- 如何学习Java并发编程
只要从事JAVA开发的小伙伴们,都会或多或少地接触到并发编程.对于初学者来说,这一部分内容比较晦涩难懂,并且嵌入了很多新技术.本篇博文旨在为小伙伴们提供学习Java并发编程的指导性建议.当然,这仅仅是 ...
- 从0基础学习Python(13)[面向对象思想]
从0基础学习Python (Day13) 面向对象思想 1.面向对象编程介绍 面向对象 概述 目前软件开发技术中两种主流思想:面向过程.面向对象 面向过程思想出现较早,C语言 面向对象思想 ...
最新文章
- 田志刚:要你共享,但不告诉你共享什么
- wxWidgets:wxResourceTranslationsLoader类用法
- 按钮旁边加一个提示_地铁站的那些“红色按钮”,你知道是干啥用的吗?乱按可能被拘留...
- java filter教程_Java Web Filter 过滤器学习教程(推荐)
- linux监控http连接数,zabbix监控linux tcp连接数
- stc和sac_短期成本曲线
- 冒险岛无敌外挂代码诠释
- 2019年PAT甲级冬季考试真题及参考答案
- 关于新版本Firefox浏览器无法使用firebug与firepath问题的解决方案
- 使用java实现MD5码算法
- 23Bootstrap
- Jira Seraph 中的身份验证绕过漏洞(CVE-2022-0540)
- 基于微信实现H5扫一扫功能详细过程
- js josn prase
- 新股发行密集时重视申购技巧
- Springboot 结合 Vue 进行本地接口联调
- ios王者荣耀服务器维护31号,王者荣耀iOS还在维护怎么回事 3月31日王者荣耀IOS什么时候能上...
- ColBERT(2020SIGIR)
- ora-28040解决方法
- 11月钓鱼网站简报:阿里巴巴占比居首 新网次之
热门文章
- IBM启动2014三大战略方向
- V2V Data Offloading for Cellular Network Based on the SDN Inside MEC Architecture 学习笔记
- strong_alias、weak_alias
- DNS中的SPF记录
- android 床头闹钟,史上最强"叫床"闹钟!让你再也睡不着啦~~(支持 Android)
- Android动态修改icon--让你的app浪起来
- leetcode-004-0811. 硬币
- mac必备的文件管理器:Path Finder Mac中文版
- 面试官都爱问的java模式之建造者模式!!!
- scsi和iscsi区别