一.goroutine简介
- Golang中最迷人的一个优势就是从语言层面就支持并发
- 在Golang中的goroutine(协程)相似于其余语言的线程
- 并发和并行
- 并行(parallelism)指不一样的代码片断同时在不一样的物理处理器上支持
- 并发(concurrency)指同时管理多个事情,物理处理器上可能运行某个内容一半后就处理其余事情
- 在通常看来并发的性能要好于并行.由于计算机的物理资源是固定的,较少的,而程序须要执行的内容是不少的.因此并发是”以较少的资源去去作更多事情”
- 几种主流并发模型
- 多线程,每一个线程只处理一个请求,只有请求结束后,对应的线程才会接收下一个请求.这种模式在高并发下,性能开销极大.
- 基于回调的异步IO.在程序运行过程当中可能产生大量回调致使维护成本加大,程序执行流程也不便于思惟
- 协程.不须要抢占式调用,能够有效提高线程任务的并发性,弥补了多线程模式的缺点;Golang在语言层面就支持,而其余语言不多支持(内核态与用户态)
- goroutine的语法
- 表达式能够是一条语句
- 表达式也能够是函数,函数返回值即便有,也无效,当函数执行完成此goroutine自动结束
go 表达式
二. 代码示例
- 对比屡次调用函数和使用goroutine的效果
package main
import "fmt"
import "time"
func main() {
//正常调用,输出3遍1 2 3 4 5(每一个数字后换行)
//for i:=1; i<=3; i++ {
// go demo()
//}
/*
添加go关键字后发现控制台什么也没有输出
缘由:把demo()设置到协程后没等到函数执行,主
线程执行结束
*/
for i := 1; i <= 3; i++ {
go demo(i)
}
}
func demo(index int) {
for i := 1; i <= 5; i++ {
fmt.Printf("第%d次执行,i的值为:%d\n", index, i)
}
}
- 添加休眠等待goroutine执行结束
- 这种方式很大的问题就是休眠时间,若是休眠时间设置太小,可能goroutine并无执行完成,若是休眠时间设置过大,影响程序执行执行.找到的本次执行的休眠时间,下次程序执行时这个休眠时间可能”过大”或”太小"
- 经过程序运行结果发现每次执行结果都不必定是同样的,由于每一个demo()都是并发执行
package main
import "fmt"
import "time"
func main() {
//正常调用,输出3遍1 2 3 4 5(每一个数字后换行)
//for i:=1; i<=3; i++ {
// go demo()
//}
/*
添加go关键字后发现控制台什么也没有输出
缘由:把demo()设置到协程后没等到函数执行,主
线程执行结束
*/
for i := 1; i <= 3; i++ {
go demo(i)
}
/*
添加休眠,让主线程等待协程执行结束.
具体休眠时间须要根据计算机性能去估计
次数没有固定值
*/
time.Sleep(3e9)
fmt.Println("程序执行结束")
}
func demo(index int) {
for i := 1; i <= 5; i++ {
fmt.Printf("第%d次执行,i的值为:%d\n", index, i)
}
}