goroutine 是如何调度的?

发布于 2022-09-05 20:43:06 字数 2015 浏览 17 评论 0

看一段 Golang 代码:

// This sample program demonstrates how to create goroutines and
// how the scheduler behaves.
package main

import (
    "fmt"
    "runtime"
    "sync"
)

// main is the entry point for all Go programs.
func main() {
    // Allocate 1 logical processor for the scheduler to use.
    runtime.GOMAXPROCS(1)

    // wg is used to wait for the program to finish.
    // Add a count of two, one for each goroutine.
    var wg sync.WaitGroup
    wg.Add(2)

    fmt.Println("Start Goroutines")

    // Declare an anonymous function and create a goroutine.
    go func() {
        // Schedule the call to Done to tell main we are done.
        defer wg.Done()

        // Display the alphabet three times
        for count := 0; count < 3; count++ {
            for char := 'a'; char < 'a'+26; char++ {
                fmt.Printf("%c ", char)
            }
        }
    }()

    // Declare an anonymous function and create a goroutine.
    go func() {
        // Schedule the call to Done to tell main we are done.
        defer wg.Done()

        // Display the alphabet three times
        for count := 0; count < 3; count++ {
            for char := 'A'; char < 'A'+26; char++ {
                fmt.Printf("%c ", char)
            }
        }
    }()

    // Wait for the goroutines to finish.
    fmt.Println("Waiting To Finish")
    wg.Wait()

    fmt.Println("\nTerminating Program")
}

执行结果:

Start Goroutines
Waiting To Finish
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N OP Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c de f g h i j k l m n o p q r s t u v w x y z
Terminating Program

这里设置逻辑 CPU 只有 1 个,也就是无法并行运行,那就是用 goroutine 并发执行了,但是这两个 goroutine 为什么每次都是先打印后面那个输出大写字母的 ?

我的理解是应该先打印前面 goroutine 的输出小写字母啊。

谁能讲一下关于 goroutine 的调度,针对这个例子来讲。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜味超标? 2022-09-12 20:43:06

是这样的。
首先说一下runtime.GOMAXPROCS(1),如果没有这句话,你打出来的<u>有可能</u>是乱序的,大小写夹杂的。因为可能是两个协程各占用了一个CPU,系统进行并发处理的。
如果你写了这一句,那么你就要求只能只用一个CPU进行执行,这样的话,两个协程会交替的执行,这叫并行执行。

然后既然你的代码里要求只能用一个CPU的话,那么就是两个协程交替执行,之所以没有按照你预期的执行是因为每个协程for 26*3 次,次数太少了,CPU一会儿就执行完了。

如果你想看效果的话,你可以这样做,在第二个协程中改成如下:

for char := 'A'; char < 'A'+26000; char++ {
fmt.Println("%c ",char)
}

至少在我的机子上,打印出的结果并不是以“abcde...xyz”结尾的:图片描述
并附上开头:图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文