Kom*_*omu 0 parallel-processing concurrency go
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")
}
Run Code Online (Sandbox Code Playgroud)
我希望输出混合起来(因为没有更好的词),而是; 示例输出是:
$ go run parallel_prog.go
开始Go Routines等待完成abcdefghijklmnopqrstu vwxyz 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终止程序
我错过了什么?
谢谢,
你没有遗漏任何东西.它正在发挥作用.这些电话没有出现"交错"(混淆),不是因为它们没有被并行化,而是因为它们发生得非常快.
您可以轻松添加一些调用以time.Sleep更好地查看并行化.通过睡觉,我们知道100%打印alphabets,numbers应该交错.
Sleep调用"强制"隔行扫描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")
}
Run Code Online (Sandbox Code Playgroud)
您可能已经知道这一点,但设置GOMAXPROCS对此示例是否并行执行没有任何影响,只是消耗了多少资源.
GOMAXPROCS设置控制多少操作系统线程同时尝试执行代码.例如,如果GOMAXPROCS为4,那么程序将只同时在4个操作系统线程上执行代码,即使有1000个goroutine.该限制不计算在I/O等系统调用中阻塞的线程.
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |