go学习笔记
基础
go 定义变量的几种方式
常量的声明
go基本数据类型
go语言中的流程控制
golang中的数组
切片
golang中的map 详解
golang 函数详解
内置函数 panic/recover
golang time包 以及日志函数
golang中的指针
golang 中的结构体
Golang 结构体 和 json互相转换 序列化 反序列化
Golang 中的 go mod 以及 Golang包 详解
golang 中的接口
golang goroutine channel 实现并发 和 并行
channel
goroutine 互斥锁 读写互斥锁
golang 反射
golang 标准库
io
strconv
工具 + blog
进程 线程 协程
空接口 类型断言
为Go项目编写Makefile
减小 Go 代码编译后的二进制体积
go windows下编译linux可执行文件
本文档使用 MrDoc 发布
-
+
首页
golang goroutine channel 实现并发 和 并行
## 为什么使用 goroutine ## 线程进程 以及 并行 并发 ## golang中的协程(goroutine) 以及主线程 **golang**中的主线程:(可以理解为线程/也可以理解为进程),在一个Golang程序的主线程上可以起**多个协程**。 golang中多协程可以实现并行或者并发。 协程:可以理解为用户级线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。Golang的一大特色就是从语言层面原生支持协程,在函数或者方法前面加go关键字就可创建一个协程。可以说golang 中的协程就是 goroutine。 ![](/media/202208/2022-08-09_155324_4157310.32515524693148257.png) **多协程和多线程**:golang中每个 goroutine(协程) 默认占用内存远比java,c的线程少。 ## goroutine 的使用以及sync.WaitGroup 并行执行需求: 在主线程(可以理解成进程)中,开启一个goroutine,该协程每隔50毫秒输出"你好 golang" 在主线程中也隔50毫秒输出"你好 golang",输出10次后,退出程序,要求主线程 和 goroutine同时执行。 ![](/media/202208/2022-08-09_183409_3330710.5951179205668897.png) ``` func test() { for i := 0; i < 10; i++ { fmt.Println("test 你好 golang", i) time.Sleep(time.Millisecond * 150) } } func main() { go test() //表示开启一个协程 for i := 0; i < 10; i++ { fmt.Println("main 你好 golang", i) time.Sleep(time.Millisecond * 50) } } ``` ### sync.WaitGroup ``` var wg sync.WaitGroup //声明一个协程计数器 func test() { for i := 0; i < 10; i++ { fmt.Println("test 你好 golang", i) time.Sleep(time.Millisecond * 150) } wg.Done() //协程计数器 -1 } func main() { wg.Add(1) //协程计数器 +1 go test() //表示开启一个协程 for i := 0; i < 10; i++ { fmt.Println("main 你好 golang", i) time.Sleep(time.Millisecond * 50) } wg.Wait() //等待协程完毕 fmt.Println("主线程退出") } ```
admin
2022年8月11日 18:00
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码