协程goroutine
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
// 注意:只要主进程执行结束完毕,则协程就会立即中止退出执行
// 协程执行结束完毕,对主进程不会有影响
// 执行该go文件程序,在主线程中每500毫秒输出一个Go,输出十次后退出程序
// 并且在主线程中开启一个goroutine协程每500毫秒输出一个Go
// 示例goroutine和主线程并行
func test1() {
for i := 1; i < 11; i++ {
fmt.Println("test()方法输出的 Go", i)
time.Sleep(time.Millisecond * 500)
}
}
// 用sync.WaitGroup实现等待协程执行完毕之后才会退出主线程
var wg sync.WaitGroup
func test2() {
for i := 1; i < 11; i++ {
fmt.Println("test()方法输出的 Go", i)
time.Sleep(time.Millisecond * 500)
}
wg.Done() // 协程数-1
}
func main() {
// 这样的写法会顺序先执行test()方法输出十次 再执行主线程的输出十次
// test1()
// for i := 1; i < 11; i++ {
// fmt.Println("主线程中输出的 Go", i)
// time.Sleep(time.Millisecond * 500)
// }
// 下面示例开启一个协程
// go test1()
// for i := 1; i < 11; i++ {
// fmt.Println("主线程中输出的 Go", i)
// time.Sleep(time.Millisecond * 500)
// }
// 可以用sync.WaitGroup实现等待协程执行完毕之后才会退出主线程
wg.Add(1) // 协程数+1
go test2()
for i := 1; i < 11; i++ {
fmt.Println("主线程中输出的 Go", i)
time.Sleep(time.Millisecond * 100) // 此主线程执行100毫秒,执行结束的会比协程要快
}
wg.Wait() // 程序执行到此语句后会等待所有协程都执行完毕才会退出
fmt.Println(runtime.NumCPU(), "个逻辑CPU") // 获取计算机上逻辑CPU的个数
runtime.GOMAXPROCS(6) // 自己设置该Go程序运行时所要占用的CPU个数
fmt.Println("程序退出了!!!")
}