Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah menggunakan `go f(i)` cara yang optimum untuk mencapai keselarian dalam Go, atau patutkah kita meneroka kaedah alternatif seperti saluran dan pekerja yang berdedikasi untuk setiap goroutine?

Adakah menggunakan `go f(i)` cara yang optimum untuk mencapai keselarian dalam Go, atau patutkah kita meneroka kaedah alternatif seperti saluran dan pekerja yang berdedikasi untuk setiap goroutine?

DDD
DDDasal
2024-11-06 04:59:02346semak imbas

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?

Pemprosesan Selari dalam Go

Masalah:

Pertimbangkan coretan kod Go yang diberikan:

<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>

Soalan:

  1. Bolehkah kita menganggap fungsi 'dowork' akan berjalan selari?
  2. Adakah ini cara yang sesuai untuk mencapai keselarian, atau patutkah kita gunakan saluran dan asingkan pekerja 'kerja' untuk setiap goroutine?

Jawapan:

Mengenai GOMAXPROCS:

Menurut nota keluaran Go 1.5:

"Secara lalai, program Go dijalankan dengan GOMAXPROCS ditetapkan kepada bilangan teras yang tersedia; dalam keluaran sebelumnya ia lalai kepada 1."

Mengenai Menghalang Keluar Fungsi Utama:

Untuk mengelakkan fungsi 'utama' daripada keluar serta-merta, jenis 'WaitGroup' boleh digunakan, khususnya fungsi 'Tunggu'.

Berkenaan Paralelisme:

Untuk memudahkan pemprosesan selari kumpulan fungsi, fungsi pembantu boleh digunakan:

<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>

Dalam kes anda, keselarian boleh dicapai seperti berikut:

<code class="go">func1 := func() {
    f(0)
}

func2 = func() {
    f(1)
}

func3 = func() {
    f(2)
}

Parallelize(func1, func2, func3)</code>

Atas ialah kandungan terperinci Adakah menggunakan `go f(i)` cara yang optimum untuk mencapai keselarian dalam Go, atau patutkah kita meneroka kaedah alternatif seperti saluran dan pekerja yang berdedikasi untuk setiap goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn