Rumah > pembangunan bahagian belakang > Golang > Mengapa Program Go Ini Mencetak 'ping' Kemudian 'hello' Walaupun Saluran Menulis Serentak?

Mengapa Program Go Ini Mencetak 'ping' Kemudian 'hello' Walaupun Saluran Menulis Serentak?

Barbara Streisand
Lepaskan: 2024-12-16 05:16:14
asal
740 orang telah melayarinya

Why Does This Go Program Print

Memahami Susunan Output Saluran di Golang

Pertimbangkan program Golang berikut:

func main() {
  messages := make(chan string)
  go func() { messages <- "hello" }()
  go func() { messages <- "ping" }()
  msg := <-messages
  msg2 := <-messages
  fmt.Println(msg)
  fmt.Println(msg2)
}
Salin selepas log masuk

Program ini melibatkan dua goroutin menulis secara tak segerak ke saluran dan bacaan rutin utama dari saluran yang sama. Walaupun saluran tidak buffer, output secara konsisten mencetak "ping" dan kemudian "hello."

Untuk memahami alasan di sebalik output ini, adalah penting untuk memahami bahawa susunan output saluran tidak berdasarkan susunan dalam yang mana goroutine dicipta. Sebaliknya, ia ditentukan oleh penjadual, yang memutuskan susunan pelaksanaan gorouti secara tidak pasti.

Apabila program dijalankan, kedua-dua gorout yang bertanggungjawab untuk menghantar mesej ke saluran berjalan serentak. Memandangkan saluran tidak dibuffer, kedua-dua gorouti disekat sehingga penerima tersedia.

Apabila rutin utama cuba membaca daripada saluran menggunakan msg := <-message, penjadual memberikan akses kepada salah satu gorouti yang menunggu . Goroutine ini berjaya menghantar mesej ke saluran, yang kemudiannya diterima oleh rutin utama dan diberikan kepada msg.

Seterusnya, apabila rutin utama cuba membaca dari saluran semula menggunakan msg2 := <-messages , penjadual memilih goroutine yang tinggal dan membenarkan ia menghantar mesejnya ke saluran. Mesej itu kemudiannya diambil oleh rutin utama dan diberikan kepada msg2.

Dalam kes ini, penjadual secara konsisten memilih "ping" penghantaran goroutine sebagai yang pertama menghantar mesejnya. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa hasil ini tidak menentukan dan boleh berubah berdasarkan faktor seperti beban sistem dan persekitaran pelaksanaan.

Ringkasnya, susunan output dalam saluran Golang tidak dijamin dan tertakluk kepada perintah pelaksanaan penjadual untuk goroutine. Oleh itu, walaupun contoh ini ringkas, output mungkin berbeza-beza pada pelaksanaan yang berbeza.

Atas ialah kandungan terperinci Mengapa Program Go Ini Mencetak 'ping' Kemudian 'hello' Walaupun Saluran Menulis Serentak?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan