启动多个goroutine
在Go语言中实现并发只需要go
关键字,就可以启动多个goroutine
。
// 使用sync.WaitGroup实现goroutine的同步
func hello(i int){
defer wg.Done() // goroutine结束就登记-1
fmt.Println("Hello Goroutine!", i)
}
func main(){
for i := 0; i < 10; i++{
wg.Add(1) // 启动一个goroutine就登记+1
go hello(i)
}
wg.Wait() // 等待所有登记的goroutine都结束
}
goroutine结束时机
goroutine用的函数结束了,goroutine也就结束了
main函数结束了,由main函数创建的那些goroutine也就都结束了
math/rand随机数函数
func f() {
// 设置随机数种子,保证每次运行都不同
rand.Seed(time.Now().UnixNano())
for i := 0; i < 5; i++{
r1 := rand.Int() // int64
r2 := rand.Intn(10) // 0 <= x <= 10
fmt.Println(r1, r2)
}
}
sync.WaitGroup线程同步机制
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func f1(i int){
defer wg.Done() // wg计数器减一
// 使用随机数模拟程序运行消耗的时间
time.Sleep(time.Microsecond * time.Duration(rand.Intn(300)))
// 打印当前是是第几个线程
fmt.Println(i)
}
var wg sync.WaitGroup // 设置全局变量(计数器)
func main() {
for i := 0; i < 5; i++{
// goroutine计数器
wg.Add(1) // wg计数器加一
go f1(i)
}
// 线程同步,只有所有的goroutine都执行完毕,才可以执行下面的代码
wg.Wait() // 等待wg计数器减为0
}