做我女朋友吧网站,东莞制作网站公司哪家好,上海发布最新情况,北京科技公司名单文章目录 Go学习-Day8单元测试Goroutine进程和线程并发和并行Go协程和主线程MPG模式CPU相关协程并行的资源竞争 Go学习-Day8
个人博客#xff1a;CSDN博客
单元测试 testing框架会将xxx_test.go的文件引入#xff0c;调用所有TestXxx的函数 在cal_test.go文件里面写这个 … 文章目录 Go学习-Day8单元测试Goroutine进程和线程并发和并行Go协程和主线程MPG模式CPU相关协程并行的资源竞争 Go学习-Day8
个人博客CSDN博客
单元测试 testing框架会将xxx_test.go的文件引入调用所有TestXxx的函数 在cal_test.go文件里面写这个 package mainimport testingfunc TestAdd(t *testing.T) {a, b : 1, 2if add(a, b) ! 4 {t.Fatalf(Wrong Answer!)}
}在cal.go文件里写这个 package mainfunc add(a int, b int) int {return a b
} 运行go test -v的命令就能运行单测 可以得到结果 RUN TestAddcal_test.go:8: Wrong Answer!
--- FAIL: TestAdd (0.00s) testing框架import这个test文件之后会调用所有TestXxx的函数注意大写
Goroutine
进程和线程
进程是程序的在操作系统的一次执行过程线程是比进程更小的单位一个进程能创建销毁多个线程一个程序至少有一个进程一个进程至少有一个线程
并发和并行
多线程在单核上运行就是并发多线程在多核上运行就是并行
Go协程和主线程 主线程类似进程 协程类似线程是轻量级的线程 协程的特点 有独立的空间共享程序的堆空间调度由用户控制协程是轻量级的线程 import (fmtstrconvtime
)func test() {for i : 0; i 5; i {fmt.Println(test() calls! strconv.Itoa(i))time.Sleep(time.Second)}
}func main() {go test()for i : 0; i 5; i {fmt.Println(main() calls! strconv.Itoa(i))time.Sleep(time.Second)}
} 输出 main() calls! 0
test() calls! 0
test() calls! 1
main() calls! 1
main() calls! 2
test() calls! 2
test() calls! 3
main() calls! 3
main() calls! 4
test() calls! 4 go关键字会另起一个协程主线程执行到这里会开一个协程并行执行如果主线程执行完毕退出协程会被强制退出
MPG模式 MMachine是操作系统的主线程也就是物理线程 PProcessor协程执行的上下文 GGorountine协程 Go语言的协程是轻量级的是逻辑态的可以起上万个协程而C/java的多线程是内核态的几千个就会耗光CPU
CPU相关
runtime.NumCPU()
//获取本地CPU数目
runtime.GOMAXPROCS(int)
//设置GO最大可用的CPU数目
//Go Max Processors协程并行的资源竞争 多个协程同时访问一个资源会发生冲突会发生并发问题 在java中我们有锁和原子类来保证并发安全 声明一个全局锁变量lock lock sync.Mutex
//sync是同步的意思Muti-excluded互斥锁lock.Lock()//在进行并发的读写操作的时候先上个锁
...//在进行操作的时候别的协程会排队等待
lock.Unlock()//解锁之后才能给别的协程使用主线程读的时候也需要加锁因为底层不知道协程已经解锁了会发生资源冲突 但是这样不同协程之间没办法通讯不知道什么时候协成完成任务了白白空转浪费时间或者提前结束主线程终止协程管道可能能解决这些问题明天再学