首頁  >  文章  >  後端開發  >  使用 go f(i) 是在 Go 中實現並行性的最佳方式嗎?

使用 go f(i) 是在 Go 中實現並行性的最佳方式嗎?

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. 這是一個實現並行性的適當方法,或者我們應該使用通道並為每個工作人員單獨使用“dowork”工作人員goroutine?

答案:

關於GOMAXPROCS:

根據Go 1.5 發行說明:

根據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 中實現並行性的最佳方式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn