定义
只需在函数调用语句前添加go关键字,就可创建并发执行单元
package main
import (
"fmt"
"runtime"
)
func say(s string) {
for i := 0; i < 3; i++ {
runtime.Gosched()
fmt.Println(s) }
}
func main() {
go say("world") //开一个新的Goroutines执行
say("hello") //当前Goroutines执行
}
Goexit 退出当前执行的goroutine,但是defer函数还会继续调用
NumCPU 返回CPU核数量
NumGoroutine 返回正在执行和排队的任务总数
GOMAXPROCS 用来设置可以运行的CPU核数
sync.WaitGroup 它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成
Add 添加或者减少等待goroutine的数量
Done 相当于Add(-1)
Wait 执行阻塞,直到所有的WaitGroup数量变成0
package main
import (
"runtime"
"sync"
)
func main() {
wg := new(sync.WaitGroup)
wg.Add(1)
go func() {
defer wg.Done()
defer println("A.defer")
func() {
defer println("B.defer")
runtime.Goexit()
println("B")
}()
println("A")
}()
wg.Wait()
}
Gosched 让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行
package main
import (
"runtime"
"sync"
)
func main() {
//它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成
wg := new(sync.WaitGroup)
//添加或者减少等待goroutine的数量
wg.Add(2)
go func() {
//相当于Add(-1)
defer wg.Done()
for i := 0; i < 6; i++ {
println(i)
if i == 3 { runtime.Gosched() }
}
}()
go func() {
defer wg.Done()
println("hello,world!")
}()
//执行阻塞,直到所有的WaitGroup数量变成0
wg.Wait()
}