package main
import (
"fmt"
"sync"
"time"
)
//第一种,利用time.sleep控制协程执行的顺序(同时保证协程全部执行完毕,否则主线程main不等待协程执行完毕就结束了)
func main() {
for i := 0; i < 100; i++ {
go Print(i)
time.Sleep(time.Second) //控制协程按照顺序有序执行
}
//time.Sleep(time.Second)
}
func Print(i int) {
fmt.Println(i)
}
//第二种 利用channel通道控制阻塞过程,从而保证、控制协程的正常执行
func main() {
c := make(chan int)
for i := 0; i < 100; i++ {
go func(i int) {
c <- i
}(i)
fmt.Println(<-c)
}
}
//带select轮询方式的协程使用
func main() {
c := make(chan int)
for i := 0; i < 100; i++ {
go func(i int) {
c <- i
}(i)
fmt.Println(<-c)
//select {
//case val := <-c:
// fmt.Println(val)
//default:
// fmt.Println("没有取到数据")
//}
}
}
//使用waitGroup方式的协程使用
func main() {
wg := sync.WaitGroup{}
lock := sync.Mutex{}
wg.Add(100)
for i := 0; i < 100; i++ {
lock.Lock()
go func(i int) {
fmt.Println(i)
wg.Done()
}(i)
lock.Unlock()
}
wg.Wait()
}
//使用waitGroup和Mutex联合使用,控制协程执行
/*
1、使用sync.waitGroup控制,保证主线程等待所有子线程执行完毕再退出
2、使用sync.Mutex互斥锁,保证线程按照顺序执行,0-100按顺序打印
关于golang中的锁
a、互斥锁sync.Mutex
一个互斥锁只能同时被一个goroutine锁定,其余的所有协程只能阻塞等待当前协程释放掉互斥锁
b、读写锁sync.RWMutex
读写锁分为读锁(lock和unlock)和写锁(Rlock和RUnlock)
当有一个写锁锁定时,新的写锁定与读锁定都将堵塞直到写解锁
当有一个读锁锁定时,新的读锁可以继续读,新的写锁将等待所有读锁解锁后才可以进行写锁定,即读写互斥,读读可同时进行
*/
func main() {
wg := sync.WaitGroup{}
lock := sync.Mutex{}
wg.Add(100)
for i := 0; i < 100; i++ {
lock.Lock()
go func(i int) {
fmt.Println(i)
wg.Done()
lock.Unlock() //注意释放锁的位置,协程抢占锁,所以在协程里面释放锁
}(i)
}
wg.Wait()
}
golang协程顺序打印0-100
于 2022-09-27 17:31:08 首次发布