Go语言中并发

作者: ropon 分类: Go 发布时间: 2019-11-23 16:01
package main

import (
	"fmt"
	"runtime"
	"sync"
)

//goroutine 类似于线程 属于用户态的线程
//goroutine 由go语言运行时(runtime)调度完成 而线程由操作系统调度完成

//需要并发执行任务时 只需将这个任务包装成一个函数 开启goroutine去执行它
//一个goroutine 必定对应一个函数 可以创建多个goroutine去执行相同函数

//操作系统线程 一般有固定的栈内存(通常2MB) 一个goroutine的栈启动时的栈内存(通常2KB) 可以按需增加或缩小

//func TestFn(i int) {
//	//函数出错也能释放
//	defer wg.Done()
//	fmt.Println("Hello World!", i)
//	//任务完成后计数器减1
//
//}

//定义全局变量wg 实现goroutine同步
var wg sync.WaitGroup

//GOMAXPROCS 配置多个os线程同时执行
func a() {
	defer wg.Done()
	for i := 1; i < 10; i++ {
		fmt.Println("A:", i)
	}
}

func b() {
	defer wg.Done()
	//for i := 1; i < 10; i++ {
	//	fmt.Println("B:", i)
	//}
	i := 0
	for {
		i ++
	}
}

//系统线程与goroutine关系
//一个操作系统线程对应用户态多个goroutine
//go可以同时使用多个操作系统线程
//goroutine和os线程是多对多关系 即m:n

func main() {
	//for i := 0; i < 10; i ++ {
	//	//启动一个任务 计数器加1
	//	wg.Add(1)
	//	go TestFn(i)
	//}
	//wg.Wait()
	//fmt.Println("This is MainFunc")
	//配置go程序运行时使用多个个逻辑CPU核心 m:n n启动 线程数,通常n设置为cpu逻辑核心
	runtime.GOMAXPROCS(1)
	wg.Add(5)
	go a()
	go b()
	go b()
	go b()
	go b()
	wg.Wait()
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!