进程、线程、协程
1、进程就是一个正在执行的程序 2、线程是进程的一个执行实例,子啊任务管理器中可以看到一个正在执行的进程可以有数个线程在运行 3、协程是并行执行
并发和并行
1、并发是多个线程同时竞争一个位置,一个时间段只有一个线程执行 2、并行是多个线程同时执行,一个时间段可以有多个线程执行 多线程程序运行在单核CPU上面,就是并发,多线程程序运行在多核CPU上面就是并行,如果多线程程序在多个CPU上面运行既有并发又有并行。 并行就是多核执行,并发就是单核竞争执行。
WaitGroup
主线程执行比较快的话,主线程执行完毕就停止了,不会等待协程执行完毕后推出,在主程序中调用并发方法,需要调用WaitGroup方法配合协程的使用,在协程全部执行完毕后后退出。在调用协程前面使用Add方法,协程的计数器加一,再调用协程方法,在调用的协程的方法中最后使用Done方法标记协程的计数器减一,方法结束。
var wg sync.WaitGroup
func test1() (
for i:=0;i<10;i++{fmt.Println("test1() 你好golang-",i)
time.sleep(time.Millisecond * 100)
wg.Done()//协程计数器加-1
func test2() {
for i := o; i < 10; i++ {fmt.PrintIn("test2() 你好golang-",i)
time.sleep(time.Millisecond * 100)
wg.Done() //协程计数器加-1
func main() (
wg.Add(1)//协程计数器加1
go test1()) //表示开启一个协程
wg.Add(1)//协程计数器加1
go test2() //表示开启一个协程
wg.Wait() //等待协程执行完毕,fmt.Println("主线程退出...")
fmt.Println("主进程退出")
第二种就是让主进程等待Sleep,但是这种不太好,因为不知道具体的执行时间,休眠多了少了都不好
CPU个数设置
使用系统真实核数
//获取当前计算机上面的 cup 个数
cpuNum := runtime.NumCPUO
fmt.Println("cpuNum=", cpuNum)
自己设置最大核数
//可以自己设置使用多个 cpu
runtime.GOMAXPROCS(cpuNum - 1)
fmt.Println("ok")
假如我的子携程里面有一个网络请求可能阻塞了。那我想要在 30 秒钟之后加一个超时间, 30 秒钟就不管有没有成功,失败都要返回来。怎么做?
在子携程中发起网络请求时,可以使用 context 包来设置超时时间和取消请求。具体的做法如下:
- 创建一个
context.Context对象,并设置超时时间:Go并发与协程