问题:
考虑给定的 Go 代码片段:
<code class="go">package main import ( "fmt" "math/rand" "time" ) func main() { for i := 0; i < 3; i++ { go f(i) } // prevent main from exiting immediately var input string fmt.Scanln(&input) } func f(n int) { for i := 0; i < 10; i++ { dowork(n, i) amt := time.Duration(rand.Intn(250)) time.Sleep(time.Millisecond * amt) } } func dowork(goroutine, loopindex int) { // simulate work time.Sleep(time.Second * time.Duration(5)) fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex) }</code>
问题:
答案:
关于 GOMAXPROCS:
根据 Go 1.5 发行说明:
“默认情况下,Go 程序运行时将 GOMAXPROCS 设置为可用内核数;在之前的版本中默认为 1。”
关于防止主函数退出:
为了防止“main”函数立即退出,可以使用“WaitGroup”类型,特别是“Wait”函数。
关于并行性:
为了促进函数组的并行处理,可以使用辅助函数:
<code class="go">import "sync" // Parallelize executes functions concurrently func Parallelize(functions ...func()) { var waitGroup sync.WaitGroup waitGroup.Add(len(functions)) defer waitGroup.Wait() for _, function := range functions { go func(f func()) { defer waitGroup.Done() f() }(function) } }</code>
在您的情况下,可以按如下方式实现并行性:
<code class="go">func1 := func() { f(0) } func2 = func() { f(1) } func3 = func() { f(2) } Parallelize(func1, func2, func3)</code>
以上是使用 go f(i) 是在 Go 中实现并行性的最佳方式吗?还是我们应该探索替代方法,例如每个 goroutine 的通道和专用工作人员?的详细内容。更多信息请关注PHP中文网其他相关文章!