golang中goroutine
2024-09-02 13:59:21
1. 概念
goroutine 奉行通过通信来共享内存,而不是共享内存来通信
goroutine 是由go的运行时(runtime)调度和管理的
go程序会智能的将goroutine中的任务合理的分配给CPU执行
go语言之所以会被称为现代化编程语言,是因为它在语言层面已经内置了调度和上下文切换的机制
在go语言编程中你不需要自己去写进程、线程、协程,当你需要让某个任务并发执行的时候,
你只需要把这个任务包装成一个函数,开启一个goroutine去执行这个函数就可以了。
一个goroutine必须对应一个函数,可以创建多个goroutine去执行相同的函数
2. goroutine实现同步
package main import (
"fmt"
"sync"
) var wg sync.WaitGroup func main() { for i := 0; i < 10; i++ {
wg.Add(1)
go hello(i)
} // 此处使用sync.WaitGroup来实现goroutine的同步
wg.Wait() // 多次执行代码,发现打印的顺序不一致,因为10个goroutine是并发执行的,而goroutine的调度是随机的 } func hello(i int) {
defer wg.Done()
fmt.Println("goroutine", i)
}
3. 子goroutine是依赖于主goroutine的,主goroutine一旦结束,子goroutine立马结束
package main import (
"fmt"
"time"
) func main() {
// 合起来写
go func() {
i := 0
for {
i++
fmt.Printf("new goroutine: i = %d\n", i)
time.Sleep(time.Second)
}
}()
i := 0
for {
i++
fmt.Printf("main goroutine: i = %d\n", i)
time.Sleep(time.Second)
if i == 2 {
break
}
}
}
最新文章
- PostgreSQL-function、trigger
- 强大的commons
- MySQL数据库备份和还原的常用命令小结
- 40. Combination Sum II
- easyui textarea IE8中无法换行
- UART与USART的差别
- jquery插件,美化select标签
- 静态方法中不能new内部类的实体对象
- 怎么提高ArcGIS for Desktop10.x的性能
- 我的Cocos2dx开发模式
- (3)markdown软件的使用
- Hyperledger Fabric Model——超级账本组成模型
- 【BZOJ3224】【tyvj1728】普通平衡树
- jquery操作iframe的方法:父页面和子页面相互操作的方法
- [蓝桥杯]ALGO-20.算法训练_求先序排列
- c++ primer 笔记 (二)
- 前端基础之jQuery操作标签
- Linux 指令(一)文件/目录操作
- 《剑指offer》— JavaScript(31)整数中1出现的次数(从1到n整数中1出现的次数)
- Jenkins+Ant+Git+Jmeter实现持续集成
热门文章
- Go1.18中的泛型编程
- 【LeetCode】294. Flip Game II 解题报告 (C++)
- 【LeetCode】1003. Check If Word Is Valid After Substitutions 解题报告(Python)
- 【LeetCode】605. Can Place Flowers 解题报告(Python & C++)
- 【LeetCode】643. 子数组最大平均数 I Maximum Average Subarray I (Python)
- 【LeetCode】817. Linked List Components 解题报告(Python & C++)
- The Longest Straight(FZUoj2216)
- Electron-Vue 项目使用Element的el-table组件不显示
- 使用 jQuery 选择器获取页面元素,然后利用 jQuery 对象的 css() 方法设置其 display 样式属性,从而实现显示和隐藏效果。
- 编写Java程序,实现客户端向服务端上传文件的功能