go学习笔记并发

定义

只需在函数调用语句前添加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()
}
坚持原创技术分享,您的支持将鼓励我继续创作!