زمان تأخیر برای برنامه هایی که به منابع خارجی وصل می شوند اهمیت دارد یا در غیر این صورت به زمان اجرای محدود نیاز پیدا میکنند. پیاده سازی این وقفه ها در زبان گو به لطف کانال ها و 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 ---------------------------------- عملیات کانال غیر مسدود >>