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

WBOY
Lepaskan: 2024-02-12 23:06:09
ke hadapan
1024 orang telah melayarinya

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")
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!