💢 تا حالا به این فکر کردی چجوری میشه یه کاری رو دقیقاً تا یه لحظه مشخص زمانبندی کرد و مطمئن شد که یا تموم میشه یا لغو؟
💠تو Go و ابزار context میتونی عملیاتهاتو دقیقاً با یه مهلت مشخص (Deadline) کنترل کنی.
مثلاً فرض کن یه کدی داریم که باید یه تابع به اسم ()work رو اجرا کنه. این تابع قراره 100 میلیثانیه طول بکشه. حالا دو تا سناریو داریم:
1️⃣سناریوی اول: مهلت کافیه (150+ میلیثانیه)
اینجا Deadline رو 150 میلیثانیه تعیین میکنیم، یعنی کد ما زمان کافی داره.
func main() {
deadline := time.Now().Add(150 * time.Millisecond)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
res, err := execute(ctx, work)
fmt.Println(res, err) // نتیجه درست برمیگرده
}
✅خروجی:
کد بدون مشکل اجرا میشه چون زمان کافی داشتیم.
2️⃣ سناریوی دوم: مهلت کافی نیست (50+ میلیثانیه)
حالا Deadline رو 50 میلیثانیه میذاریم، اما ()work حداقل 100 میلیثانیه نیاز داره.
func main() {
deadline := time.Now().Add(50 * time.Millisecond)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
res, err := execute(ctx, work)
fmt.Println(res, err) // نتیجه لغو میشه
}
😀خروجی:
عملیات لغو میشه (
context.Canceled
) چون مهلت کافی وجود نداشت.
🫶فرق بین W
ithTimeout
و W
ithDeadline
چیه؟
بله WithTimeout یه مقدار زمان مشخص میگیره (مثلاً 5 ثانیه)، اماWithDeadline دقیقاً یه زمان مشخص (مثلاً 23:00:05).
جالبیش اینه که WithTimeout خودش از WithDeadline استفاده میکنه:
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
💠چچطوری بفهمیم کانتکست Deadline داره؟
با متد Deadline، میتونیم زمان مشخص شده رو ببینیم.
اگه کانتکست با WithTimeout یا WithDeadline شده باشه، یه زمان مشخص میده.
اما اگه با WithCancel یا Background ساخته شده باشه، میگه نه!
ctx, _ := context.WithCancel(context.Background())
deadline, ok := ctx.Deadline()
fmt.Println(deadline, ok) // نتیجه: false
ctx = context.Background()
deadline, ok = ctx.Deadline()
fmt.Println(deadline, ok) // باز هم false
🔸اگر تجربه ای ازش داری،تجربههات رو برامون بگو!
#گو #گولنگ #Go #Golang