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