Golang学习笔记:goroutine
1.goroutine
goroutine是go语言的并发体。在go语言里面能使用go关键字来实现并发。
go func()
1.1 概念介绍
goroutine本质上是协程,我刚刚学习的时候就粗略地认为goroutine是线程,直到最近才开始搞明白goroutine的基本概念。
并发
在很久以前,人们希望一个计算机(一个cpu)上能同时执行多项任务,让cpu在某段时间内进行分片,在某段很短时间内执行程序a,然后又迅速得切换到程序b去执行,让人们看起来就像是两个程序在同时进行,这就是并发。
进程
但是人们随之发现,cpu在切换程序的时候,如果不保存上一个程序的状态(也就是我们常说的context--上下文),直接切换下一个程序,就会丢失上一个程序的一系列状态,于是引入了进程这个概念,用以划分好程序运行时所需要的资源。因此进程就是一个程序运行时候的所需要的基本资源单位(也可以说是程序运行的一个实体)。
并行
如果一个电脑有多个cpu,每个cpu都有进程在运行,这就是并行。
用户态与内核态
为了防止用户程序做出一些危险的指令,如关机,更改系统变量,修改别的进程数据,系统分为两种运行状态,用户态以及内核态,用户态是我们的程序所在的状态,不能随便对内核的底层进行操作。如果我们需要使用内核的底层操作的时候,内核提供了一种调用内核的接口,我们调用这些接口也就是系统调用,在进行系统调用的时候,cpu会切换到内核态,才能执行内核的函数。
线程
人们又发现一个问题,cpu切换多个进程的时候,会花费不少的时间,因为切换进程需要切换到内核态,而每次调度需要内核态都需要读取用户态的数据,进程一旦多起来,cpu调度会消耗一大堆资源,因此引入了线程的概念,线程本身几乎不占有资源,他们共享进程里的资源,内核调度起来不会那么像进程切换那么耗费资源。
协程
但是线程还是需要内核去进行调度,切换起来也是需要把用户态的数据写入到内核态,也是需要耗费一定的计算机资源,那可以不可以将切换的调度改成我们自己控制的呢,答案是有的,协程就是把自己的调度算法交给程序(用户态)去进行管理,能以更小的资源去进行并发。
goruntine
goroutine就是一个协程例子,可以根据自身调度器进行调度,当某个gooutine调用了time.sleep方法或者channel,mutex阻塞时候,调度器会使其入睡,唤醒另一个goroutine,根本不需要进入到内核态。
2.通信
goroutine本质上是协程,可以理解为不受内核调度,而受go调度器管理的线程。goroutine之间可以通过channel进行通信,如下:
func main() {
c := make(chan string)
go func(){
c <- "hello"
}()
go func(){
word := <- c + " world"
fmt.Println(word)
}()
time.Sleep(1 * time.Second)
}
3.安全退出
goroutine只有在自身所在函数运行完毕,或者主函数运行完毕才会打断,因而上面的例子需要等待一秒,不然未执行完的goroutine会直接被打断。 如果我们并发的线程数量多了之后,我们不可能在main里面设置一个精确睡眠时间来评估所有的goroutine已经运行完毕然后退出。
这时候我们可以使用sync.WaitGroup来等待所有运行的goroutine运行结束后,再来退出main函数,主要原理是维护一个goroutine数量的计数器,每运行一个goroutine,计数器会加+1,运行结束后,计数器会-1,然后调用wait方法会一直阻塞,知道计数器为0,也就是当前运行的goroutine数量为0,实例如下:
func main() {
var n sync.WaitGroup
for i := 0; i < 20; i++ {
n.Add(1)
go func(i int, n *sync.WaitGroup) {
defer n.Done()
time.Sleep(1 * time.Second)
fmt.Printf("goroutine %d is running\n", i)
}(i, &n)
}
n.Wait()
}
Golang学习笔记:goroutine的更多相关文章
- golang学习笔记 --- goroutine
package main import ( "fmt" "io" "io/ioutil" "net/http" &quo ...
- golang学习笔记6 beego项目路由设置
golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...
- go语言,golang学习笔记2 web框架选择
go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...
- golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- golang学习笔记18 用go语言编写移动端sdk和app开发gomobile
golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- golang学习笔记14 golang substring 截取字符串
golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
随机推荐
- 常见web攻击总结
搞Web开发离不开安全这个话题,确保网站或者网页应用的安全性,是每个开发人员都应该了解的事.本篇主要简单介绍在Web领域几种常见的攻击手段及Java Web中的预防方式. XSS SQL注入 DDOS ...
- js 过多 导致页面加载过慢
自己的代码检查了很久,才检查 出来 通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊, 一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含 ...
- CentOS7下安装python-pip
一.检查是否已经安装 检查linux有没有安装python-pip包,直接执行:: yum install python-pip 二.安装 pip install 1.没有python-pip包就执行 ...
- kubernetes进阶(03)kubernetes的namespace
服务发现与负载均衡Kubernetes在设计之初就充分考虑了针对容器的服务发现与负载均衡机制,提供了Service资源,并通过kube-proxy配合cloud provider来适应不同的应用场景. ...
- istio入门(02)istio的架构和概念
Istio从逻辑上可以分为数据平面和控制平面: 数据平面主要由一系列的智能代理(Envoy)组成,管理微服务之间的网络通信 控制平面负责管理和配置这些智能代理,并动态执行策略 主要由以下组件构成 En ...
- 解决编写的 html 乱码问题
- C#Json转DataTable
需求:有一个log文件,需要整理成Excel,日志文件里面的数据都是json字符串 思路是,把Json字符串转换成DataTable,然后导出到Excel 在网上找了一些资料,整理了以下三种类型的Js ...
- IIFE的形式、原理和常见写法
immediately invoked function expression 立即调用的函数表达式 出现的形式: 最近做牛客网的JS在线编程,遇到几道考闭包的题目,发现闭包的尾巴那儿经常会出现一对小 ...
- Java-Maven(四):Eclipse集成Maven环境配置
一般maven都需要集成到IDE上使用的,而不是单独的使用,常见的maven可集成IDE:eclipse.IntelliJ IDEA.但这里就只学习eclipse集成maven的基础上,进行maven ...
- https://segmentfault.com/a/1190000004518374#articleHeader3
https://segmentfault.com/a/1190000004518374#articleHeader3 https://segmentfault.com/q/10100000049065 ...