为什么我所谓的并行 go 程序不是并行的
Why is my supposedly parallel go program not parallel
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func alphabets() {
for char := 'a'; char < 'a'+26; char++ {
fmt.Printf("%c ", char)
}
wg.Done() //decrement number of goroutines to wait for
}
func numbers() {
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
}
wg.Done()
}
func main() {
runtime.GOMAXPROCS(2)
wg.Add(2) //wait for two goroutines
fmt.Println("Starting Go Routines")
go alphabets()
go numbers()
fmt.Println("\nWaiting To Finish")
wg.Wait() //wait for the two goroutines to finish executing
fmt.Println("\nTerminating Program")
}
我希望输出会混淆(因为缺少更好的词),但是相反;样本输出是:
$ 去 运行 parallel_prog.go
启动 Go 例程
等待完成
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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
终止程序
我错过了什么?
谢谢,
你什么都没有遗漏。它的工作。调用没有显示 "interlaced"(混淆)不是因为它们没有被并行化,而是因为它们发生 非常快。
您可以轻松地向 time.Sleep
添加一些调用以更好地查看并行化。通过睡眠,我们 100% 知道打印 alphabets
和 numbers
应该是交错的。
您的程序 Sleep
调用 "force" 隔行扫描
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func alphabets() {
defer wg.Done()
for char := 'a'; char < 'a'+26; char++ {
fmt.Printf("%c ", char)
time.Sleep(time.Second * 2)
}
}
func numbers() {
defer wg.Done()
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
time.Sleep(time.Second * 3)
}
}
func main() {
fmt.Println("Starting Go Routines")
wg.Add(2)
go alphabets()
go numbers()
fmt.Println("\nWaiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
备注
你可能已经知道了,但是设置GOMAXPROCS
对这个例子是否并行执行没有任何影响,只是它消耗了多少资源。
The GOMAXPROCS setting controls how many operating systems threads attempt to execute code simultaneously. For example, if GOMAXPROCS is 4, then the program will only execute code on 4 operating system threads at once, even if there are 1000 goroutines. The limit does not count threads blocked in system calls such as I/O.
您是否有机会使用围棋游乐场?当我在本地 运行 你的代码时,我得到:
Starting Go Routines
Waiting To Finish
1 2 3 4 5 6 7 8 9 10 11 12 a 13 14 15 16 17 b 18 19 c 20 21 d 22 23 e 24 25 f 26 g h i j k l m n o p q r s t u v w x y z
Terminating Program
游乐场本质上是确定性的。 Goroutines 不会经常屈服,也不会 运行 在多个线程中。
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func alphabets() {
for char := 'a'; char < 'a'+26; char++ {
fmt.Printf("%c ", char)
}
wg.Done() //decrement number of goroutines to wait for
}
func numbers() {
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
}
wg.Done()
}
func main() {
runtime.GOMAXPROCS(2)
wg.Add(2) //wait for two goroutines
fmt.Println("Starting Go Routines")
go alphabets()
go numbers()
fmt.Println("\nWaiting To Finish")
wg.Wait() //wait for the two goroutines to finish executing
fmt.Println("\nTerminating Program")
}
我希望输出会混淆(因为缺少更好的词),但是相反;样本输出是:
$ 去 运行 parallel_prog.go
启动 Go 例程 等待完成 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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 终止程序
我错过了什么?
谢谢,
你什么都没有遗漏。它的工作。调用没有显示 "interlaced"(混淆)不是因为它们没有被并行化,而是因为它们发生 非常快。
您可以轻松地向 time.Sleep
添加一些调用以更好地查看并行化。通过睡眠,我们 100% 知道打印 alphabets
和 numbers
应该是交错的。
您的程序 Sleep
调用 "force" 隔行扫描
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func alphabets() {
defer wg.Done()
for char := 'a'; char < 'a'+26; char++ {
fmt.Printf("%c ", char)
time.Sleep(time.Second * 2)
}
}
func numbers() {
defer wg.Done()
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
time.Sleep(time.Second * 3)
}
}
func main() {
fmt.Println("Starting Go Routines")
wg.Add(2)
go alphabets()
go numbers()
fmt.Println("\nWaiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
备注
你可能已经知道了,但是设置GOMAXPROCS
对这个例子是否并行执行没有任何影响,只是它消耗了多少资源。
The GOMAXPROCS setting controls how many operating systems threads attempt to execute code simultaneously. For example, if GOMAXPROCS is 4, then the program will only execute code on 4 operating system threads at once, even if there are 1000 goroutines. The limit does not count threads blocked in system calls such as I/O.
您是否有机会使用围棋游乐场?当我在本地 运行 你的代码时,我得到:
Starting Go Routines
Waiting To Finish
1 2 3 4 5 6 7 8 9 10 11 12 a 13 14 15 16 17 b 18 19 c 20 21 d 22 23 e 24 25 f 26 g h i j k l m n o p q r s t u v w x y z
Terminating Program
游乐场本质上是确定性的。 Goroutines 不会经常屈服,也不会 运行 在多个线程中。