9.4.6.1 توضیحات #
الگو cancellation که حرکت تکنیکی هست برای ارسال سینگال به گوروتین ها استفاده می شود که باید اجرای کاری را متوقف کند و ایده اصلی این کار با استفاده بستن کانال صورت میگیرد.
9.4.6.2 دیاگرام #
9.4.6.3 نمونه کد #
1package main
2
3import (
4 "fmt"
5 "time"
6)
7
8func main() {
9 // create cancel channel
10 cancel := make(chan struct{})
11
12 // start goroutine
13 go func() {
14 for {
15 select {
16 case <-cancel:
17 fmt.Println("Cancelled")
18 return
19 default:
20 fmt.Println("Running")
21 time.Sleep(time.Second)
22 }
23 }
24 }()
25
26 // run goroutine for 3 seconds
27 time.Sleep(3 * time.Second)
28
29 // close cancel channel
30 close(cancel)
31
32 // wait for goroutine to stop
33 time.Sleep(time.Second)
34}
در کد فوق ما یک کانال از نوع ساختار ایجاد کردیم با عنوان cancel و این کانال را داخل یکی از case های select بصورت دریافت قرار دادیم که در ادامه ما یک Sleep ۳ گذاشتیم تا فرآیند انجام شود و Running چاپ شود. پس از آن کانال را close کردیم و سیگنال لغو فرآیند ارسال شد و گوروتین کاملا متوقف شد.
9.4.6.4 کاربردها #
- لغو یک کار طولانیمدت: عملکردی که عملیات زمانبر مانند درخواست شبکه یا محاسبات را انجام میدهد، اگر دیگر به آن نیاز نباشد یا از مهلت زمانی فراتر رود، میتوان آن را لغو کرد.
- پاکسازی منابع: تابعی که منابعی مانند فایل یا اتصال شبکه را تخصیص می دهد، می تواند لغو شود تا این منابع قبل از اینکه دیگر مورد نیاز نباشند آزاد شوند.
- خاتمه دادن به یک سرور: سروری که چندین درخواست را مدیریت میکند، میتواند با لغو تمام عملکردهای در حال اجرا که این درخواستها را انجام میدهند، بهخوبی خاموش شود.
- لغو یک کار پس زمینه: یک کار پس زمینه که همزمان با برنامه اصلی اجرا می شود را می توان لغو کرد تا از اجرای آن جلوگیری شود.