28.آموزش GO با مثال(زمان تأخیر)

زمان تأخیر برای برنامه هایی که به منابع خارجی وصل می شوند اهمیت دارد یا در غیر این صورت به زمان اجرای محدود نیاز پیدا میکنند. پیاده سازی این وقفه ها در زبان گو به لطف کانال ها و select راحت و عالی شده است.

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

برای این مثال , فرض کنید ما یک ارجاع خارجی اجرا میکنیم که نتیجه آن را در کانال c1 بعد از 2 ثانیه برمیگرداند.

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

در اینجا پیاده سازی select یک زمان تأخیر است. res := <-c1منتظر نتیجه میماند و <-Time.After منتظر یک مقدار میماند تا آن را پس از زمان تأخیر 1ثانیه ارسال کند. زمانی که select با اولین دریافتی ای که آماده است اقدام میکند،در حالتی که عملیات بیشتر از 1ثانیه زمان بگیرد ما مقدار تأخیر از آن میگیریم.

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

اگر ما اجازه دهیم که زمان تأخیر از 3ثانیه بیشتر شود، در این صورت ما c2را با موفقیت دریافت میکنیم و آن را به عنوان نتیجه در خروجی چاپ میکنیم.

   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")
    }
}

اجرای این برنامه

اجرای این برنامه نشان میدهد که اولین و دومین عملیات زمان تأخیر با موفقیت اجرا میشود.

$ go run timeouts.go 
timeout 1
result 2

استفاده از الگوی انتخاب زمان تأخیر(select timeout) نیازمند برقراری ارتباط از طریق کانالهاست.به صورت عمومی این یک ایده خوب است چون مهمترین ویژگی های GO رو کانالها و select بنا شده اند. در آینده ما به دو مثال از این مورد خواهیم پرداخت: تایمرها و tickers.

<< دستور Select ---------------------------------- عملیات کانال غیر مسدود >>