Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?

Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?

WBOY
WBOYke hadapan
2024-02-09 10:39:20765semak imbas

go 通道的行为是否会根据消息发送到它的方式而改变?

editor php Xiaoxin Dalam bahasa Go, saluran ialah mekanisme yang digunakan untuk memindahkan data antara goroutine. Gelagat saluran bergantung pada cara mesej dihantar kepadanya. Apabila saluran diisytiharkan sebagai penimbal, goroutine yang menghantar mesej akan meletakkan mesej ke dalam penimbal saluran dan kemudian meneruskan pelaksanaan. Apabila saluran diisytiharkan tidak buffer, goroutine yang menghantar mesej akan disekat sehingga goroutine lain menerima mesej daripada saluran. Oleh itu, boleh dikatakan bahawa tingkah laku saluran berubah bergantung pada cara mesej dihantar kepadanya.

Kandungan soalan

Mengapa kedua-dua keping kod ini dilaksanakan secara berbeza?

  1. Menjalankan kod berikut akan mengembalikan fatal 错误:所有 goroutine 都在休眠 - 死锁!ralat.
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
  1. Menjalankan kod berikut dengan betul akan mengembalikan 2 dan 3 (satu baris setiap satu).
ch := make(chan int)
    go buffer(ch)
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}

func buffer(ch chan int) {
    ch <- 2
    ch <- 3
}

#1 hanya berfungsi dengan betul jika ch ditakrifkan sebagai saluran penimbal. kenapa? Mengapa buffer() dalam ch menerima 2 nilai tanpa mengeluh?

Penyelesaian

Hantar operasi pada saluran yang tidak buffer akan disekat sehingga goroutine lain membaca data daripadanya. Inilah sebabnya mengapa sekeping kod pertama menemui jalan buntu: apabila anda menghantar ke saluran, tiada goroutine lain membaca daripadanya.

Dalam kes kedua, anda mempunyai goroutine menghantar dua nilai ke saluran, dan goroutine utama membaca dari saluran dua kali semasa menghantar. Saluran tidak menerima dua hantaran, tetapi satu demi satu, dengan operasi penghantaran pertama dinyahsekat oleh bacaan pertama dan operasi penghantaran kedua dinyahsekat oleh bacaan kedua.

Atas ialah kandungan terperinci Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam