Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memperbaiki \"ralat maut: semua goroutine sedang tidur - kebuntuan\" dalam Go?

Bagaimana untuk Memperbaiki \"ralat maut: semua goroutine sedang tidur - kebuntuan\" dalam Go?

DDD
DDDasal
2024-11-18 07:41:02697semak imbas

How to Fix

Go: Memahami dan Menyelesaikan "ralat maut: semua goroutine sedang tidur - kebuntuan"

Apabila melaksanakan program Go, menghadapi mesej ralat "ralat maut: semua gorouti sedang tidur - kebuntuan" menunjukkan bahawa semua gorouti program (benang ringan) disekat selama-lamanya, mengakibatkan kebuntuan.

Dalam kod yang disediakan, isu ini timbul disebabkan sifat tidak buffer saluran "file1chan". Apabila nilai dihantar ke saluran tidak buffer, ia menyekat jika tiada goroutine lain bersedia untuk menerimanya. Dalam kes ini, goroutine utama menghantar nilai kepada "file1chan" tanpa sebarang goroutin serentak menerima daripadanya, yang membawa kepada kebuntuan.

Penyelesaian 1: Memperkenalkan Corak Konkurensi

Untuk menyelesaikan kebuntuan, perkenalkan goroutine serentak yang berasingan yang menerima nilai daripada "file1chan" dan mengelakkan daripada menyekat goroutine utama. Kod yang diubah suai dengan pendekatan goroutine di bawah:

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { 
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)
            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    print(file1chan) 
}

Penyelesaian 2: Gunakan Saluran Penimbalan

Sebagai alternatif, anda boleh menggunakan saluran penimbal untuk mengendalikan nombor tetap nilai tanpa menyebabkan kebuntuan. Saluran penimbal dengan kapasiti satu sudah memadai untuk tugasan ini:

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.Fields(line)
        for i := range parts {
            file1chan <- parts[i]
        }
    }
    close(file1chan)
    print(file1chan)
}

Dengan saluran penimbal, pengirim boleh terus melaksanakan walaupun penerima belum bersedia, sekali gus mengelakkan kebuntuan.

Atas ialah kandungan terperinci Bagaimana untuk Memperbaiki \"ralat maut: semua goroutine sedang tidur - kebuntuan\" dalam Go?. 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