Golang 并行
Golang Parallel
我是 Golang 的新手,正在尝试了解并发和并行。我阅读了下面提到的关于并发和并行的文章。我执行了相同的程序。但没有得到相同的(混合字母和字符)输出。首先获取所有字母,然后获取字符。似乎并发不起作用 并行不是。
文章说添加 runtime.GOMAXPROCS(4) 进行并行。
为什么我没有得到平行输出?
我正在使用4核CPU系统和GO 版本1.8.2
https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html
我知道如果我们添加 Sleep 然后我可以看到并行输出,按照并发概念。但是Parallelism说如果系统有多个CPU,那么每个线程都会运行在一个CPU中,它就变成了Parallel进程。
我的问题是为什么我的系统有 4 个内核并添加了 runtime.GOMAXPROCS(4), .
但我没有得到并行输出
去编程
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(2)
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Starting Go Routines")
go func() {
defer wg.Done()
for char := ‘a’; char < ‘a’+26; char++ {
fmt.Printf("%c ", char)
}
}()
go func() {
defer wg.Done()
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
}
}()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
我的输出
Starting Go Routines
Waiting To Finish
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 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
Terminating Program
预期输出(不一样,但并行输出)
Starting Go Routines
Waiting To Finish
a b 1 2 3 4 c d e f 5 g h 6 i 7 j 8 k 9 10 11 12 l m n o p q 13 r s 14
t 15 u v 16 w 17 x y 18 z 19 20 21 22 23 24 25 26
Terminating Program
我认为这段代码有两个问题。
第一个想法:
runtime.GOMAXPROCS(2)
使用这一行你只允许两个工人,但你开始了三个 Go Routines(Main 需要一个)。
但主要问题是 Go Routines 完成得太快了。添加
time.Sleep(100000)
将解决这个问题。
主包
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(3)
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Starting Go Routines")
go func() {
defer wg.Done()
for char := 'a'; char < 'a'+26; char++ {
for i := 0; i < 10000; i++ {
_ = i * 2
}
fmt.Printf("%c ", char)
}
}()
go func() {
defer wg.Done()
for number := 1; number < 27; number++ {
for i := 0; i < 10000; i++ {
_ = i * 2
}
fmt.Printf("%d ", number)
}
}()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
在这种情况下,我尝试不使用睡眠功能,因为它们会更改调度程序中的线程状态。结果我得到了这个。
Starting Go Routines
Waiting To Finish
1 2 3 4 a 5 b 6 c d 7 8 e f 9 g h 10 i j 11 k 12 l m 13 n 14 o p q 15 r 16 s 17 t u 18 v 19 w 20 x y 21 z 22 23 24 25 26
Terminating Program
由于在我上面的例子中for循环有条件27,所以程序执行很快并且看不到并行性。我编写了不同的示例并增加了条件,然后我可以看到并行输出。
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func init() {
fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!", runtime.NumCPU())
}
func main() {
fmt.Println(" Welcome to concurrency")
wg.Add(2)
go one()
go two()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
func one() {
for i := 0; i < 200; i++ {
fmt.Println("one", i)
}
defer wg.Done()
}
func two() {
for i := 0; i < 200; i++ {
fmt.Println("Two:", i)
}
defer wg.Done()
}
2015 年 8 月 28 日更新:Go 1.5 设置为使 GOMAXPROCS 的默认值与计算机上的 CPU 数量相同。我删除了 runtime.GOMAXPROCS(4)
那是因为你的算法没有进行足够的运算以允许看到并行性。例如,尝试增加 for 语句的循环次数。
我是 Golang 的新手,正在尝试了解并发和并行。我阅读了下面提到的关于并发和并行的文章。我执行了相同的程序。但没有得到相同的(混合字母和字符)输出。首先获取所有字母,然后获取字符。似乎并发不起作用 并行不是。
文章说添加 runtime.GOMAXPROCS(4) 进行并行。
为什么我没有得到平行输出?
我正在使用4核CPU系统和GO 版本1.8.2
https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html
我知道如果我们添加 Sleep 然后我可以看到并行输出,按照并发概念。但是Parallelism说如果系统有多个CPU,那么每个线程都会运行在一个CPU中,它就变成了Parallel进程。 我的问题是为什么我的系统有 4 个内核并添加了 runtime.GOMAXPROCS(4), .
但我没有得到并行输出去编程
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(2)
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Starting Go Routines")
go func() {
defer wg.Done()
for char := ‘a’; char < ‘a’+26; char++ {
fmt.Printf("%c ", char)
}
}()
go func() {
defer wg.Done()
for number := 1; number < 27; number++ {
fmt.Printf("%d ", number)
}
}()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
我的输出
Starting Go Routines
Waiting To Finish
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 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
Terminating Program
预期输出(不一样,但并行输出)
Starting Go Routines
Waiting To Finish
a b 1 2 3 4 c d e f 5 g h 6 i 7 j 8 k 9 10 11 12 l m n o p q 13 r s 14
t 15 u v 16 w 17 x y 18 z 19 20 21 22 23 24 25 26
Terminating Program
我认为这段代码有两个问题。 第一个想法:
runtime.GOMAXPROCS(2)
使用这一行你只允许两个工人,但你开始了三个 Go Routines(Main 需要一个)。
但主要问题是 Go Routines 完成得太快了。添加
time.Sleep(100000)
将解决这个问题。 主包
import (
"fmt"
"runtime"
"sync"
)
func main() {
runtime.GOMAXPROCS(3)
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Starting Go Routines")
go func() {
defer wg.Done()
for char := 'a'; char < 'a'+26; char++ {
for i := 0; i < 10000; i++ {
_ = i * 2
}
fmt.Printf("%c ", char)
}
}()
go func() {
defer wg.Done()
for number := 1; number < 27; number++ {
for i := 0; i < 10000; i++ {
_ = i * 2
}
fmt.Printf("%d ", number)
}
}()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
在这种情况下,我尝试不使用睡眠功能,因为它们会更改调度程序中的线程状态。结果我得到了这个。
Starting Go Routines
Waiting To Finish
1 2 3 4 a 5 b 6 c d 7 8 e f 9 g h 10 i j 11 k 12 l m 13 n 14 o p q 15 r 16 s 17 t u 18 v 19 w 20 x y 21 z 22 23 24 25 26
Terminating Program
由于在我上面的例子中for循环有条件27,所以程序执行很快并且看不到并行性。我编写了不同的示例并增加了条件,然后我可以看到并行输出。
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func init() {
fmt.Println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!", runtime.NumCPU())
}
func main() {
fmt.Println(" Welcome to concurrency")
wg.Add(2)
go one()
go two()
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")
}
func one() {
for i := 0; i < 200; i++ {
fmt.Println("one", i)
}
defer wg.Done()
}
func two() {
for i := 0; i < 200; i++ {
fmt.Println("Two:", i)
}
defer wg.Done()
}
2015 年 8 月 28 日更新:Go 1.5 设置为使 GOMAXPROCS 的默认值与计算机上的 CPU 数量相同。我删除了 runtime.GOMAXPROCS(4)
那是因为你的算法没有进行足够的运算以允许看到并行性。例如,尝试增加 for 语句的循环次数。