/u011957758/article/details/81159481
前言
如果说php是最好的语言,那么golang就是最并发的语言。
支持golang的并发很重要的一个是goroutine的实现,那么本文将重点围绕goroutine来做一下相关的笔记,以便日后快速留恋。
10s后,以下知识点即将靠近:
1.从并发模型说起
的简介
的使用姿势
4.通道(channel)的简介
5.重要的四种通道使用
死锁与处理
的简介
的应用场景
死锁
正文
1.从并发模型说起
看过很多大神简介,各种研究高并发,那么就通俗的说下并发。
并发目前来看比较主流的就三种:
1.多线程
每个线程一次处理一个请求,线程越多可并发处理的请求数就越多,但是在高并发下,多线程开销会比较大。
2.协程
无需抢占式的调度,开销小,可以有效的提高线程的并发性,从而避免了线程的缺点的部分
3.基于异步回调的IO模型
说一个熟悉的,比如nginx使用的就是epoll模型,通过事件驱动的方式与异步IO回调,使得服务器持续运转,来支撑高并发的请求
为了追求更高效和低开销的并发,golang的goroutine来了。
的简介
定义:在go里面,每一个并发执行的活动成为goroutine。
详解:goroutine可以认为是轻量级的线程,与创建线程相比,创建成本和开销都很小,每个goroutine的堆栈只有几kb,并且堆栈可根据程序的需要增长和缩小(线程的堆栈需指明和固定),所以go程序从语言层面支持了高并发。
程序执行的背后:当一个程序启动的时候,只有一个goroutine来调用main函数,称它为主goroutine,新的goroutine通过go语句进行创建。
的使用姿势
3.1单个goroutine创建
在函数或者方法前面加上关键字go,即创建一个并发运行的新goroutine。
上代码:
package main
import (
"fmt"
"time"
)
func HelloWorld() {
("Hello world goroutine")
}
func main() {
go HelloWorld() // 开启一个新的并发运行
(1*)
("我后面才输出来")
}
以上执行后会输出:
Hello world goroutine
我后面才输出来
需要注意的是,执行速度很快,一定要加sleep,不然你一定可以看到goroutine里头的输出。
这也说明了一个关键点:当main函数返回时,所有的gourutine都是暴力终结的,然后程序退出。
3.2多个goroutine创建
package main
import (
"fmt"
"time"
)
func DelayPrint() {
for i := 1; i <= 4; i++ {
(250 * )
(i)
}
}
func HelloWorld() {
("Hello world goroutine")
}
func main() {
go DelayPrint() // 开启第一个goroutine
go HelloWorld() // 开启第二个goroutine
(2*)
("main function")
}
函数输出: