Go by Example: Timeouts

Vaqt tugashi tashqi resurslarga ulanadigan yoki boshqacha sababga ko’ra bajarilish vaqtini cheklashi kerak bo’lgan dasturlar uchun muhim. Go da vaqt tugashini amalga oshirish kanallar va select tufayli oson va nafis.

package main
import (
    "fmt"
    "time"
)
func main() {

Misol uchun, 2s dan keyin natijasini c1 kanaliga qaytaradigan tashqi chaqiruvni bajaryapmiz deylik. E’tibor bering, kanal buferlangan, shuning uchun goroutinadagi yuborish bloklamaydi. Bu kanal hech qachon o’qilmagan taqdirda goroutina oqib ketishining oldini olish uchun keng tarqalgan usul.

    c1 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c1 <- "result 1"
    }()

Quyida vaqt tugashini amalga oshiruvchi select. res := <-c1 natijani kutadi, <-time.After esa 1s vaqt tugashidan keyin yuboriladigan qiymatni kutadi. select tayyor bo’lgan birinchi qabul bilan davom etgani uchun, operatsiya ruxsat etilgan 1s dan ko’proq vaqt olsa, vaqt tugashi holatini olamiz.

    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(1 * time.Second):
        fmt.Println("timeout 1")
    }

Agar 3s lik uzunroq vaqt tugashiga ruxsat bersak, c2 dan qabul qilish muvaffaqiyatli bo’ladi va natijani chop etamiz.

    c2 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "result 2"
    }()
    select {
    case res := <-c2:
        fmt.Println(res)
    case <-time.After(3 * time.Second):
        fmt.Println("timeout 2")
    }
}

Bu dasturni ishga tushirish birinchi operatsiyaning vaqti tugaganini va ikkinchisi muvaffaqiyatli bo’lganini ko’rsatadi.

$ go run timeouts.go 
timeout 1
result 2

Keyingi misol: .