首页  >  文章  >  后端开发  >  使用 go f(i) 是在 Go 中实现并行性的最佳方式吗?还是我们应该探索替代方法,例如每个 goroutine 的通道和专用工作人员?

使用 go f(i) 是在 Go 中实现并行性的最佳方式吗?还是我们应该探索替代方法,例如每个 goroutine 的通道和专用工作人员?

DDD
DDD原创
2024-11-06 04:59:02346浏览

Is using `go f(i)` the optimal way to achieve parallelism in Go, or should we explore alternative methods like channels and dedicated workers for each goroutine?

Go 中的并行处理

问题:

考虑给定的 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>

问题:

  1. 我们可以假设“dowork”函数将并行运行吗?
  2. 这是实现并行性的适当方法吗?或者我们应该这样做吗?为每个 goroutine 使用通道和单独的“dowork”工作人员?

答案:

关于 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn