为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine/Gosched/Goexit/GOMAXPROCS

标签:
Go


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)

    }

}

©著作权归作者所有:来自51CTO博客作者ck_god的原创作品,如需转载,请注明出处,否则将追究法律责任

G


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消