9.4.6 الگو Cancellation

9.4.6 الگو Cancellation

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}
1$ go run main.go
2Running
3Running
4Running
5Cancelled

در کد فوق ما یک کانال از نوع ساختار ایجاد کردیم با عنوان cancel و این کانال را داخل یکی از case های select بصورت دریافت قرار دادیم که در ادامه ما یک Sleep ۳ گذاشتیم تا فرآیند انجام شود و Running چاپ شود. پس از آن کانال را close کردیم و سیگنال لغو فرآیند ارسال شد و گوروتین کاملا متوقف شد.

9.4.6.4 کاربردها #

  • لغو یک کار طولانی‌مدت: عملکردی که عملیات زمان‌بر مانند درخواست شبکه یا محاسبات را انجام می‌دهد، اگر دیگر به آن نیاز نباشد یا از مهلت زمانی فراتر رود، می‌توان آن را لغو کرد.
  • پاکسازی منابع: تابعی که منابعی مانند فایل یا اتصال شبکه را تخصیص می دهد، می تواند لغو شود تا این منابع قبل از اینکه دیگر مورد نیاز نباشند آزاد شوند.
  • خاتمه دادن به یک سرور: سروری که چندین درخواست را مدیریت می‌کند، می‌تواند با لغو تمام عملکردهای در حال اجرا که این درخواست‌ها را انجام می‌دهند، به‌خوبی خاموش شود.
  • لغو یک کار پس زمینه: یک کار پس زمینه که همزمان با برنامه اصلی اجرا می شود را می توان لغو کرد تا از اجرای آن جلوگیری شود.