0%

goroutine

  • goroutine
  • 匿名协程
  • Goexit()

    Go 协程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package main

    import (
    "fmt"
    "time"
    )

    //子goroutine
    func newTask() {
    i := 0
    for {
    i++
    fmt.Printf("new Goroutine : i = %d\n", i)
    time.Sleep(1 * time.Second)
    }
    }

    //主goroutine
    func main() {
    //创建一个go程 去执行newTask() 流程
    go newTask()

    i := 0
    for {
    i++
    fmt.Printf("main goroutine: i = %d\n", i)
    time.Sleep(1 * time.Second)
    }

    }
    注意事项:
  • 使用 go 关键字创建一个协程
  • 主协程( main ) 结束后,子协程都将终止

    匿名协程与 Goexit()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package main

    import (
    "fmt"
    "runtime"
    "time"
    )

    func main() {
    //用go创建承载一个形参为空,返回值为空的一个函数
    go func() {
    defer fmt.Println("A.defer")

    func() {
    defer fmt.Println("B.defer")
    //退出当前goroutine
    runtime.Goexit()
    fmt.Println("B")
    }()

    fmt.Println("A")
    }()

    go func(a int, b int) bool {
    fmt.Println("a = ", a, ", b = ", b)
    return true
    }(10, 20)

    time.Sleep(5 * time.Second)
    }
    运行结果:
    goroutine1
    注意事项:
  • Goexit() 后会执行栈中的 defer 语句
  • 协程不能接受其他协程的返回值(应使用 channel