### Gosched()
使当前Go协程放弃处理器,让其他协程运行。不会挂起当前协程,未来恢复执行。
Go语言的协程是抢占式调度,当遇到长时间执行或者系统调用时,会主动把当前goroutine的CPU(P)转让出去,让其他的goroutine能够被调用并执行,一般出现以下几种情况,goroutine就会发生调度:
* [ ] ayscall
* [ ] C函数调用
* [ ] 主动调用runtime.Goschen
* [ ] 某个goroutine的调用超过100ms,并且调用了非内联的函数
> **runtime.Gosched()**
>
由于main函数抢占了CPU的控制权,导致第一个for循环没有运行完。如果想要第一个for循环执行,在第二个for循环中使用runtime.Gosched()来阻止获得控制权
```
package main
import (
"fmt"
// "runtime"
)
func main() {
go func() {
for i := 0; i < 3; i++ {
fmt.Println("go")
}
}()
for i := 0; i < 2; i++ {
// runtime.Gosched()
fmt.Println("main")
}
}
结果:
main
main
go
```
### Goexit()
终止调用的协程,其他的不受影响
> **runtime.Goexit()**
```
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
go func() {
defer fmt.Println("defer关键词 会让表达式最后执行")
fmt.Println("Hello World")
}()
go func() {
defer fmt.Println("defer关键词 会让表达式最后执行")
fmt.Println("你好,世界!")
runtime.Goexit() // 效果和return一样
fmt.Println("这里不会执行")
}()
time.Sleep(time.Second * 5)
}
结果:
你好,世界!
Hello World
defer关键词 会让表达式最后执行
defer关键词 会让表达式最后执行
```
### GOMAXPROCS()
设置程序运行中使用的CPU数,可设置同时执行最大CPU数。
> runtime.GOMAXPROCS()
```
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
n := runtime.GOMAXPROCS(1)
fmt.Println("先前最大核心数为", n)
// 运行时间戳 毫秒
last := time.Now()
// 耗时任务
for i := 0; i < 10000000; i++ {
a := 1
a += 1
}
now := time.Now()
// 计算程序运行的时间
fmt.Println(now.Sub(last))
}
结果:
先前最大核心数为 12
2.1563ms
```
- 安装开发环境
- 安装开发环境
- 安装详细教程
- 引入包
- Go语言基础
- 基本变量与数据类型
- 变量
- 数据类型
- 指针
- 字符串
- 代码总结
- 常量与运算符
- 常量
- 运算符
- 流程控制
- if判断
- for循环
- switch分支
- goto跳转
- 斐波那契数列
- Go语言内置容器
- 数组
- 切片
- 映射
- 函数
- 函数(上)
- 函数(中)
- 函数(下)
- 小节
- 包管理
- 结构体
- 结构体(上)
- 结构体(中)
- 结构体(下)
- 小节
- 错误处理
- 错误处理
- 宕机
- 错误应用
- 小节
- 文件操作
- 获取目录
- 创建和删除目录
- 文件基本操作(上)
- 文件基本操作(中)
- 文件基本操作(下)
- 处理JSON文件
- 接口与类型
- 接口的创建与实现
- 接口赋值
- 接口嵌入
- 空接口
- 类型断言(1)
- 类型断言(2)
- 小节
- 并发与通道
- goroutine协程
- runtime包
- 通道channel
- 单向通道channel
- select
- 线程同步
- 多线程的深入学习
- http编程
- http简介
- Client和Request
- get请求
- post请求
- 模块函数方法
- 模块
- fmt库,模块
- 项目练习
- 爬虫:高三网
- 爬虫:快代理
- 爬虫:快代理2
- 多线程:通道思路
- 多线程爬虫:快代理