Rumah >pembangunan bahagian belakang >Golang >Mengapa Penyata Go Select dengan Goroutine Hang Melainkan Penyata Cetakan Ditambah?

Mengapa Penyata Go Select dengan Goroutine Hang Melainkan Penyata Cetakan Ditambah?

Linda Hamilton
Linda Hamiltonasal
2024-11-26 22:46:11514semak imbas

Why Does a Go Select Statement with a Goroutine Hang Unless a Print Statement is Added?

Goroutine dengan Select Tidak Berhenti Melainkan Penyata Cetakan Ditambah

Dalam latihan Go Tour #71, menggunakan pilih tanpa lalai pernyataan boleh mengakibatkan gelung tak terhingga yang menghalang goroutine daripada keluar. Isu ini dihadapi apabila menjalankan 71_hang.go dengan hujah nogood, tetapi bukan dengan hujah ok.

Perbezaan antara kedua-dua senario ialah kehadiran pernyataan fmt.Print("") tambahan dalam lalai kes pernyataan pilih. Secara lalai, pilih blok sehingga salah satu saluran mempunyai mesej untuk diterima. Walau bagaimanapun, dengan kes lalai, select akan melaksanakan pernyataan lalai walaupun tiada saluran mempunyai mesej yang tersedia.

Dalam kod asal, tanpa pernyataan fmt.Print(""), pernyataan pilih memasukkan gelung tak terhingga kerana tiada saluran dengan mesej tersedia, dan kes lalai tidak melakukan apa-apa untuk membenarkan goroutine menjadualkan. Menambah pernyataan fmt.Print("") membenarkan penjadual menjadualkan goroutin lain dan memecahkan gelung tak terhingga.

Sebagai alternatif, kod itu boleh diubah suai untuk menggunakan pilih dengan cara tanpa menyekat, membenarkan gorouti lain untuk berjalan dengan betul. Ini boleh dicapai dengan mengalih keluar pernyataan lalai dan menggunakan pernyataan if yang berasingan untuk menyemak sama ada kaunter merangkak telah mencapai sifar, seperti yang ditunjukkan dalam kod yang diubah suai di bawah:

for {
    select {
        case todo := <-toDoList:
            if todo.depth > 0 && !visited[todo.url] {
                crawling++
                visited[todo.url] = true
                go crawl(todo, fetcher, toDoList, doneCrawling)
            }
        case <-doneCrawling:
            crawling--
    }
    if crawling == 0 {
        break
    }
}

Atas ialah kandungan terperinci Mengapa Penyata Go Select dengan Goroutine Hang Melainkan Penyata Cetakan Ditambah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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