gpt4 book ai didi

design-patterns - Go 并发模式 - 模式 #2

转载 作者:IT王子 更新时间:2023-10-29 01:40:04 26 4
gpt4 key购买 nike

在视频中Google I/O 2012 - Go Concurrency Patterns ,Rob Pike在视频中17:00左右介绍了Multiplexing Pattern。使用 fanIn() 函数,谁准备好了就先说话。

但是当我在 here - play.golang.org/p/cvAi5MAAKT 中汇编程序时,它总是按顺序运行

NumCPU:  4  //Edit#1 output
Joe 0
Ann 0
Joe 1
Ann 1
Joe 2
Ann 2
Joe 3
Ann 3
Joe 4
Ann 4

You're both boring: I'm leaving

这段代码有什么问题?

package main

import "fmt"
import "time"
import "math/rand"

//Pattern #2
//Multiplexing
func fanIn(in1, in2 <-chan string) <-chan string {
c := make(chan string)
go func() {for {c <- <-in1}}()
go func() {for {c <- <-in2}}()
return c
}

func boring(msg string) <-chan string {
c := make(chan string)
go func() {
for i := 0; ; i++ {
c <- fmt.Sprintf("%s %d\n", msg, i)
time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
}
}()
return c
}

func main() {
//Edit#1 according to the first answer, add following two lines
fmt.Println("NumCPU: ", runtime.NumCPU())
runtime.GOMAXPROCS(runtime.NumCPU())

c := fanIn(boring("Joe"), boring("Ann"))
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
fmt.Println("You're both boring: I'm leaving")
}

更新 1:根据答案,我已经更改了代码,但结果还是一样。我正在使用 Windows 7。请参阅上面“Edit#1”中的更改。

更新2:

我找到了答案:只需将循环数增加到一个更大的数字(比如 40),即使 GOMAXPROCS 使用默认值,它也会显示不同的顺序。您可以在 Playground 上尝试。

最佳答案

没有错,您只是没有告诉 Go 运行时使用多个线程。设置 GOMAXPROCS 环境变量*,或使用 runtime 包的 runtime.GOMAXPROCS功能。 GOMAXPROCS 确定 Go 运行时创建的操作系统线程数,以复用您创建的 goroutines。如果 GOMAXPROCS 为 1(默认值),您通常会看到非常确定的行为。

例如当运行你的程序时:

GOMAXPROCS=4 ./myProgram

例如在你的程序中:

runtime.GOMAXPROCS(runtime.NumCPU())

附言*如果您使用的是 playground 而不是您自己的机器,则 GOMAXPROCS 将始终为 1。

关于design-patterns - Go 并发模式 - 模式 #2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com