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()
}