goroutine 是如何调度的?

看一段 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 的调度,针对这个例子来讲。

回答:

是这样的。
首先说一下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”结尾的:图片描述
并附上开头:图片描述

以上是 goroutine 是如何调度的? 的全部内容, 来源链接: utcz.com/p/182864.html

回到顶部