goroutine/Gosched/Goexit/GOMAXPROCS

发布时间:2020-08-10 21:18:09 作者:ck_god
来源:网络 阅读:263

goroutine

// code_037_concurrency_goroutine project main.go
package main

import (
    "fmt"
    "time"
)

//并发,concurrency; 并行,parallel;而Go从语言层面就支持了并行,而Go语言提供了自动垃圾回收机制。
//goroutine说到底其实就是协程,执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩

func newTask() {
    i := 0
    for {
        i++
        fmt.Printf("new gorotine: i= %d\n", i)
        time.Sleep(1 * time.Second)
        if i == 10 {
            break
        }
    }
}

func main() {
    go newTask()

    //goroutine>>> 主goroutine退出后,其它的工作goroutine也会自动退出
    i := 0
    for {
        i++
        fmt.Printf("main goroutine : i =%d\n", i)
        time.Sleep(1 * time.Second)
        if i == 10 {
            break
        }
    }

}

Goexit >>>

// code_039_goroutine_runtime_Goexit project main.go
package main

import (
    "fmt"
    "runtime"
)

//备注:调用 runtime.Goexit() 将立即终止当前 goroutine 执⾏,调度器确保所有已注册 defer延迟调用被执行。
func main() {
    go func() {
        defer fmt.Println("A.defer")

        func() {
            defer fmt.Println("B.defer")
            runtime.Goexit() // 终止当前 goroutine, import "runtime"
            fmt.Println("B") //不会执行
        }()
        fmt.Println("A") //不会执行
    }()

    //死循环,目的不让主goroutine结束
    for {
    }
}

Gosched >>>

// code_038_goroutine_runtime project main.go
package main

import (
    "fmt"
    "runtime"
)

func main() {
    //runtime包:Gosched()、Goexit()、GOMAXPROCS()
    //runtime.Gosched() 用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。
    //调用 runtime.Goexit() 将立即终止当前 goroutine 执行,调度器确保所有已注册 defer延迟调用被执行。
    //调用 runtime.GOMAXPROCS() 用来设置可以并行计算的CPU核数的最大值,并返回之前的值。
    go func(s string) {
        for i := 0; i < 5; i++ {
            fmt.Println(s)
        }
    }("world")

    for i := 0; i < 5; i++ {
        runtime.Gosched()
        fmt.Println("Hello")
    }
}

GOMAXPROCS >>>

// code_040_goroutine_runtime_GOMAXPROCS project main.go
package main

import (
    "fmt"
    "runtime"
)

//调用 runtime.GOMAXPROCS() 用来设置可以并行计算的CPU核数的最大值,并返回之前的值。
func main() {
    n := runtime.GOMAXPROCS(1)
    //  n := runtime.GOMAXPROCS(2)
    fmt.Printf("n=%d\n", n)

    for {
        go fmt.Print(0)
        fmt.Print(1)
    }
}
推荐阅读:
  1. flag 是Go 标准库提供的解析命令行参数的包QANDA.REN文库
  2. go 的fallthrough特征

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go goroutine goexit

上一篇:干货 | 金融级互联网产品持续交付的挑战与应对

下一篇:Web前端—— 开发规范课程简介及现实意义和Html的命名规范

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》