Rumah > Artikel > pembangunan bahagian belakang > Mengapakah program Go saya kadangkala mencetak hasil jumlah sebelum \"paparkan mesej pertama\"?
Go Concurrency dan Kekeliruan Saluran: Memahami Perintah Pelaksanaan Goroutine
Dalam Go, concurrency dicapai melalui goroutin, benang ringan yang berjalan serentak dalam satu satu proses. Saluran menyediakan cara untuk berkomunikasi antara goroutine. Walau bagaimanapun, memahami cara goroutine dan saluran berinteraksi boleh menjadi mencabar, terutamanya untuk pemula.
Artikel ini meneroka titik kekeliruan biasa yang berkaitan dengan perintah pelaksanaan goroutine dan komunikasi saluran. Contoh atur cara yang disediakan:
<code class="go">package main import "fmt" func display(msg string, c chan bool) { fmt.Println("display first message:", msg) c <- true } func sum(c chan bool) { sum := 0 for i := 0; i < 10000000000; i++ { sum++ } fmt.Println(sum) c <- true } func main() { c := make(chan bool) go display("hello", c) go sum(c) <-c }</code>
Atur cara ini dijangka akan mencetak "paparkan mesej pertama: hello" sebagai output pertama, diikuti dengan hasil pengiraan jumlah. Walau bagaimanapun, dalam beberapa kes, pengiraan jumlah tamat sebelum fungsi paparan menghantar data ke saluran.
Penjelasan:
Penjadual dalam Go menentukan susunan goroutine dilaksanakan. Ia bukan deterministik, bermakna perintah pelaksanaan mungkin berbeza-beza bergantung pada faktor seperti perkakasan dan sistem pengendalian. Dalam contoh ini:
Walau bagaimanapun, penjadual juga boleh melaksanakan jumlah goroutine hingga selesai sebelum paparan goroutine menghantar data ke saluran. Dalam kes ini, outputnya ialah:
10000000000 display first message: hello
Penyelesaian:
Untuk memastikan mesej paparan dicetak sebelum hasil jumlah, seseorang boleh menggunakan hasil saluran untuk menerima keputusan pertama dan keluar dari program. Fungsi utama yang diubah suai ialah:
<code class="go">func main() { result := make(chan string) go display("hello", result) go sum(result) fmt.Println(<-result) }</code>
Atas ialah kandungan terperinci Mengapakah program Go saya kadangkala mencetak hasil jumlah sebelum \"paparkan mesej pertama\"?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!