Bagaimana Mengendalikan Tamat Masa dengan Benar dengan Saluran dalam Go Apabila Menyemak Kebolehcapaian URL?

Mary-Kate Olsen
Lepaskan: 2024-11-20 02:18:02
asal
853 orang telah melayarinya

How to Properly Handle Timeouts with Channels in Go When Checking URL Reachability?

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

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

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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan