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 的调度,针对这个例子来讲。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是这样的。
首先说一下
runtime.GOMAXPROCS(1)
,如果没有这句话,你打出来的<u>有可能</u>是乱序的,大小写夹杂的。因为可能是两个协程各占用了一个CPU,系统进行并发处理的。如果你写了这一句,那么你就要求只能只用一个CPU进行执行,这样的话,两个协程会交替的执行,这叫并行执行。
然后既然你的代码里要求只能用一个CPU的话,那么就是两个协程交替执行,之所以没有按照你预期的执行是因为每个协程for 26*3 次,次数太少了,CPU一会儿就执行完了。
如果你想看效果的话,你可以这样做,在第二个协程中改成如下:
至少在我的机子上,打印出的结果并不是以“abcde...xyz”结尾的:
并附上开头: