0、Go语言中的并发编程
goroutinegoroutine�goroutinegoroutine
channelgoroutinegoroutinechannel
1、goroutine简介

在Java和C++中我们要实现并发编程的时候,必须要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时还要自己去调度线程执行任务并维护上下文切换。

goroutinegoroutine
2、goroutine应用
goroutinegogoroutine
goroutinegoroutine
package main

import (
	"fmt"
	"time"
)

// goroutine
func hello(i int){
	fmt.Println("hello",i)
}

// 程序启动之后会创建一个主goroutine去执行
func main(){
	for i:=0;i<100;i++ {
		//go hello(i) // 开启一个单独的goroutine去执行hello函数(任务)
		go func(i int){
			fmt.Println(i)
		}(i)
	}
	fmt.Println("main")
	time.Sleep(time.Second)
	// main函数结束了 由main函数启动的goroutine也都结束了
}
goroutine
package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

func f(i int){
	defer wg.Done() // 计数器减1
	time.Sleep(time.Millisecond * time.Duration(rand.Intn(300)))
	fmt.Println(i)
}

var wg sync.WaitGroup

func main(){
	//f()
	for i:=0;i<10;i++{
		wg.Add(1)  // 计数器加1
		go f(i)
	}
	// 如何知道这10个goroutine都结束了
	wg.Wait() // 等待wg的计数器减为0

}
3、GOMAXPROCS
GOMAXPROCS
package main

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

var wg sync.WaitGroup

func a(){
	defer wg.Done()
	for i:=0;i<10;i++{
		fmt.Printf("A:%d\n",i)
	}
}

func b(){
	defer wg.Done()
	for i:=0;i<10;i++{
		fmt.Printf("B:%d\n",i)
	}
}

func main(){
	runtime.GOMAXPROCS(1) // 指定在N个核心数上调度
	wg.Add(2)
	go a()
	go b()
	wg.Wait()
}