美文网首页
【Go面试题】关于GMP特性的编程问题

【Go面试题】关于GMP特性的编程问题

作者: WayneJoe | 来源:发表于2024-07-27 18:56 被阅读0次

1.设置runtime.GOMAXPROCS(1)

func TestOneGoMaxProcs(n int) {
    runtime.GOMAXPROCS(1)
    wg := &sync.WaitGroup{}
    wg.Add(n)
    for i := 0; i < n; i++ {
        go func(i int) {
            fmt.Printf("%d,", i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}
1.1 遍历50每个1协程,打印结果及原因

打印结果: 先打印最后一个数字49,然后顺序打印其它数字。

//  p对应结构体,位于runtime/runtime2.go
type p struct{
    m muintptr // 指向它服务的那个线程
    runqhead   // 本地队列的头
    runqtail   // 本地队列的尾
    runq [256]guintptr // 256长度指针,每个指针指向一个g
    runnext guintptr   // 指向下一个可用的指针
}

原因:因为新创建的协程会进入 _p_.runnext,而之前的在_p_.runnext中的协程则会被移动到_p_.runq队列中,所以49先打印了之后才是按照大小依次打印。

1.2 遍历300每个1协程,打印结果及原因

打印结果: 先打印最后一个数字,部分随机,局部有序打印其它数字。
原因:本地队列runq最大256,超出则会存全局队列
参考链接

2 使用多个协程并发的按照顺序打印

2.1 交替打印奇偶数
runtime.GOMAXPROCS(1) // 可同时使用cpu核数1
    wg := sync.WaitGroup{}
    wg.Add(2)
    go func() {
        defer wg.Done()
        for i := 0; i < 10; i++ {
            if i%2 != 0 {
                fmt.Println(i)
            }
            runtime.Gosched() // 让出cpu
        }
    }()
    go func() {
        defer wg.Done()
        for i := 0; i < 10; i++ {
            if i%2 == 0 {
                fmt.Println(i)
            }
            runtime.Gosched()
        }
    }()
    wg.Wait()

参考链接

相关文章

  • struct

    面向对象编程 Go支持面向对象编程特性,但和传统面向对象编程是有区别的,Go并不是纯粹的面向对象语言。 Go没有类...

  • # Go 方法编程与面向对象

    上一节,我们看到 Go 函数特性及函数式编程风格。这一节,将会主要展示Go的方法特性及面向对象编程。什么是方法?当...

  • Go语法指南

    出处---Go编程语言 欢迎来到 Go 编程语言指南。本指南涵盖了该语言的大部分重要特性 Go 语言的交互式简介,...

  • Go GMP

    一文彻底弄懂go中的调度GMP先说,协程的本质是用户态的线程,用户对其有控制权限,内存占用少,切换代价低。 再来解...

  • go 调度器实现

    GO 语言的调度器 目录 GMP 模型简介 调度器实现机制 GMP 模型简介 先来一张经典的GMP 关系图 G 是...

  • 第十六章:Go语言面向对象编程

    1. GO语言OOP概述 Go语言不是纯粹的面向对象的语言,准确是描述是,Go语言支持面向对象编程的特性.Go语言...

  • Go Web编程.epub

    【下载地址】 《Go Web编程》介绍如何用Go语言进行Web应用的开发,将Go语言的特性与Web开发实战组合到一...

  • Go - GMP模型

    简述 G — 表示 Goroutine,它是一个待执行的任务; M — 表示操作系统的线程,它由操作系统的调度器调...

  • Go语言的主要特性与发展的环境和影响因素

    1.2 Go语言的主要特性与发展的环境和影响因素 1.2.1 影响 Go 语言发展的早期编程语言 正如 “21 世...

  • 【语言学习】Go语言之routine特性

    1 什么是routine(协程) go routine 是属于go的一个很重要的特性,是go并发编程的一部分,如同...

网友评论

      本文标题:【Go面试题】关于GMP特性的编程问题

      本文链接:https://www.haomeiwen.com/subject/dwavhjtx.html