Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah "Saluran Tunggu Tamat Masa" tersuai saya tidak berfungsi dan bagaimanakah caranya?

Mengapakah "Saluran Tunggu Tamat Masa" tersuai saya tidak berfungsi dan bagaimanakah caranya?

WBOY
WBOYke hadapan
2024-02-12 23:06:091062semak imbas

Mengapakah Saluran Tunggu Tamat Masa tersuai saya tidak berfungsi dan bagaimanakah caranya?

Apabila editor php Xiaoxin menggunakan "saluran menunggu tamat masa" tersuai, anda mungkin menghadapi situasi di mana ia tidak berfungsi. Ini mungkin disebabkan oleh beberapa isu biasa, seperti konfigurasi atau isu pengekodan yang salah. Untuk menjadikan "masa tunggu saluran" tersuai berfungsi, terdapat beberapa penyelesaian yang boleh kami ambil. Pertama, kita perlu memastikan saluran dan tamat masa dikonfigurasikan dengan betul. Kedua, kami boleh menyemak sama ada terdapat sebarang ralat atau isu logik dalam kod yang boleh menyebabkan saluran menunggu tamat masa tidak berfungsi. Akhir sekali, kami juga boleh mempertimbangkan untuk menggunakan teknologi atau alatan lain yang berkaitan untuk menangani masalah menunggu tamat masa, seperti menggunakan perpustakaan pembungkusan atau menggunakan pemasa untuk memantau dan mengendalikan situasi tamat masa. Melalui kaedah ini, kami boleh membuat "saluran menunggu tamat masa" tersuai berfungsi dengan baik dan meningkatkan prestasi dan kestabilan aplikasi kami.

Kandungan soalan

Saya cuba membuat "tamat masa saluran" tersuai saya sendiri. Lebih tepat lagi, fungsi time.after di dalamnya. Dalam erti kata lain, saya cuba melaksanakan ini:

select {
case v := <-c:
    fmt.println("value v: ", v)
case <-time.after(1 * time.second):
    fmt.println("timeout")
}

Tetapi malangnya saya menghadapi masalah.

Pelaksanaan saya ialah:

func waitFun(wait int) chan int {
    time.Sleep(time.Duration(wait) * time.Second)

    c := make(chan int)
    c <- wait

    return c
}

func main() {
    c := make(chan int)
    go func() {
        time.Sleep(3 * time.Second)
        c <- 10
    }()

    select {
    case v := <-c:
        fmt.Println("Value v: ", v)
    case <-waitFun(1):
        fmt.Println("Timeout")
    }

    time.Sleep(4 * time.Second)
}

Atas sebab tertentu ini tidak berfungsi. Ralatnya ialah: semua goroutine sedang tidur - kebuntuan! . Saya tahu bahawa pada satu ketika semua goroutine (utama dan yang diperkenalkan dengan fungsi tanpa nama) pergi tidur, tetapi adakah ini sebab pepijat atau sesuatu yang lain? Maksud saya, ia bukan "tidur yang tidak terhingga" atau "menunggu sesuatu yang tidak terhingga", jadi ia bukan jalan buntu, bukan? Juga, menggunakan all goroutine 正在休眠 - 死锁!。我知道在某个时刻,所有 goroutine(main 和用匿名函数引入的 goroutine)都会进入睡眠状态,但这是错误的原因还是其他原因?我的意思是,这不是“无限睡眠”或“无限等待某事”,所以这不是死锁,对吧?另外,使用 time.after 也会让 goroutine 休眠,对吗?我需要更改什么才能使我的程序正常工作?

解决方法

select 语句将在运行时评估所有情况,因此此代码实际上会等待 waitfun 返回,然后才开始侦听任何通道。您必须更改 waitfun juga akan membuatkan goroutine tidur, bukan? Apakah yang perlu saya ubah untuk menjadikan program saya berfungsi?

🎜Penyelesaian🎜🎜 Pernyataan select akan menilai semua kes pada masa jalan, jadi kod ini sebenarnya akan menunggu waitfun kembali sebelum mula mendengar mana-mana saluran. Anda perlu menukar waitfun untuk mengembalikan saluran dengan segera: 🎜
func waitFun(wait int) chan int {
    c := make(chan int)
    go func() {
       time.Sleep(time.Duration(wait) * time.Second)
       c <- wait
    }()
    return c
}

Atas ialah kandungan terperinci Mengapakah "Saluran Tunggu Tamat Masa" tersuai saya tidak berfungsi dan bagaimanakah caranya?. 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