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
Lepaskan: 2024-11-06 04:59:02
asal
364 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!