zoukankan      html  css  js  c++  java
  • Go语言基础之runtime包

    Go语言基础之runtime包

    runtime.Gosched()

    让出CPU时间片,重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤,但是你妈让你去相亲,两种情况第一就是你相亲速度非常快,见面就黄不耽误你继续烧烤,第二种情况就是你相亲速度特别慢,见面就是你侬我侬的,耽误了烧烤,但是还馋就是耽误了烧烤你还得去烧烤)

    package main
    
    import (
        "fmt"
        "runtime"
    )
    
    func main() {
        go func(s string) {
            for i := 0; i < 2; i++ {
                fmt.Println(s)
            }
        }("world")
        
        // 主协程
        for i := 0; i < 2; i++ {
            // 切一下,再次分配任务 先去干线程的活,后干自己的活
            runtime.Gosched()
            fmt.Println("hello")
        }
    }
    

    world
    world
    hello
    hello

    runtime.Goexit()

    退出当前协程(一边烧烤一边相亲,突然发现相亲对象太丑影响烧烤,果断让她滚蛋,然后也就没有然后了)

    package main
    
    import (
        "fmt"
        "runtime"
    )
    
    func main() {
        go func() {
            defer fmt.Println("A.defer")
            func() {
                defer fmt.Println("B.defer")
                // 结束协程 后面不在执行,直接退出
                runtime.Goexit()
                defer fmt.Println("C.defer")
                fmt.Println("B")
            }()
            fmt.Println("A")
        }()
        for {
        }
    }
    

    B.defer
    A.defe

    image-20211106231007578

    runtime.GOMAXPROCS

    Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。默认值是机器上的CPU核心数。例如在一个8核心的机器上,调度器会把Go代码同时调度到8个OS线程上(GOMAXPROCS是m:n调度中的n)。

    Go语言中可以通过runtime.GOMAXPROCS()函数设置当前程序并发时占用的CPU逻辑核心数。

    Go1.5版本之前,默认使用的是单核心执行。Go1.5版本之后,默认使用全部的CPU逻辑核心数。

    我们可以通过将任务分配到不同的CPU逻辑核心上实现并行的效果,这里举个例子:

    func a() {
        for i := 1; i < 10; i++ {
            fmt.Println("A:", i)
        }
    }
    
    func b() {
        for i := 1; i < 10; i++ {
            fmt.Println("B:", i)
        }
    }
    
    func main() {
        runtime.GOMAXPROCS(1)
        go a()
        go b()
        time.Sleep(time.Second)
    }
    

    B: 1
    B: 2
    B: 3
    B: 4
    B: 5
    B: 6
    B: 7
    B: 8
    B: 9
    A: 1
    A: 2
    A: 3
    A: 4
    A: 5
    A: 6
    A: 7
    A: 8
    A: 9

    两个任务只有一个逻辑核心,此时是做完一个任务再做另一个任务。 将逻辑核心数设为2,此时两个任务并行执行,代码如下。

    func a() {
        for i := 1; i < 10; i++ {
            fmt.Println("A:", i)
        }
    }
    
    func b() {
        for i := 1; i < 10; i++ {
            fmt.Println("B:", i)
        }
    }
    
    func main() {
        runtime.GOMAXPROCS(2)
        go a()
        go b()
        time.Sleep(time.Second)
    }
    

    B: 1
    B: 2
    B: 3
    B: 4
    B: 5
    B: 6
    B: 7
    B: 8
    B: 9
    A: 1
    A: 2
    A: 3
    A: 4
    A: 5
    A: 6
    A: 7
    A: 8
    A: 9

    Go语言中的操作系统线程和goroutine的关系:

    • 1.一个操作系统线程对应用户态多个goroutine。
    • 2.go程序可以同时使用多个操作系统线程。
    • 3.goroutine和OS线程是多对多的关系,即m:n。

    总结

    1. runtime.Gosched():切一下分配任务 先去干线程的活,线程活干完后干自己的活
    2. runtime.Goexit(): 干道一般有急事不干了,跑回家了,在重要的活都不干,直接退出
    3. runtime.GOMAXPROCS:分配几个线程去干活,默认CPU逻辑核心数
  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/randysun/p/15519995.html
Copyright © 2011-2022 走看看