Rumah > Artikel > pembangunan bahagian belakang > Bagaimana Mengendalikan Tamat Masa dengan Benar dengan Saluran dalam Go Apabila Menyemak Kebolehcapaian URL?
Mengendalikan Tamat Masa dengan Saluran dalam Go
Masalah:
Apabila menggunakan goroutin dan saluran untuk semak kebolehcapaian senarai URL, keadaan tamat masa nampaknya tidak dilaksanakan. Ini menyebabkan kod sentiasa kembali benar, walaupun sesetengah URL tidak boleh dicapai.
Analisis:
Isunya terletak pada pelaksanaan fungsi check(u), yang menyebabkan tamat masa tidak dapat dilaksanakan. Dalam kod anda, fungsi check(u) dilaksanakan dalam goroutine semasa, menyekat pelaksanaan penyataan pilih dalam IsReachable. Pada masa penyataan pilih dinyahsekat, kedua-dua cek(u) dan masa.Selepas(masa.Kedua) saluran sedia untuk digunakan dan masa jalan boleh memilih salah satu.
Penyelesaian 1:
Untuk menangani isu ini, anda boleh melaksanakan fungsi check(u) dalam goroutine yang berasingan:
package main import "fmt" import "time" func check(u string, checked chan<- bool) { time.Sleep(4 * time.Second) checked <- true } func IsReachable(urls []string) bool { ch := make(chan bool, 1) for _, url := range urls { go func(u string) { checked := make(chan bool) go check(u, checked) select { case ret := <-checked: ch <- ret case <-time.After(1 * time.Second): ch <- false } }(url) } return <-ch } func main() { fmt.Println(IsReachable([]string{"url1"})) }
Dalam kod yang diubah suai ini, fungsi check(u) dilaksanakan dalam goroutine, dan hasilnya dihantar ke saluran yang diperiksa. Pernyataan pilih dalam IsReachable kini menunggu sama ada saluran yang diperiksa atau saluran tamat masa bersedia. Ini memastikan bahawa keadaan tamat masa dikendalikan dengan betul.
Penyelesaian 2:
Sebagai alternatif, anda boleh memudahkan kod dengan menetapkan satu tamat masa untuk semua URL. Pendekatan ini boleh dilaksanakan jika tamat masa cukup lama berbanding masa yang diperlukan untuk membuat gorouti:
package main import "fmt" import "time" func check(u string, ch chan<- bool) { time.Sleep(4 * time.Second) ch <- true } func IsReachable(urls []string) bool { ch := make(chan bool, len(urls)) for _, url := range urls { go check(url, ch) } time.AfterFunc(time.Second, func() { ch <- false }) return <-ch } func main() { fmt.Println(IsReachable([]string{"url1", "url2"})) }
Dalam kod ini, tamat masa tunggal ditetapkan untuk semua URL yang menggunakan masa.AfterFunc. Jika mana-mana URL boleh dicapai dalam tempoh tamat masa, saluran ch akan menerima benar dan fungsi akan kembali benar. Jika tidak, false akan dihantar ke ch, dan fungsi akan mengembalikan false.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Tamat Masa dengan Benar dengan Saluran dalam Go Apabila Menyemak Kebolehcapaian URL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!