Golang协程并行笔记

协程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("程序退出了!!!")
}

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页