Middle
მითხარით, როგორ გამოიყენება კონტექსტი Go-ში.
sobes.tech AI
პასუხი AI-სგან
Go- ում კონტექსტი გამოიყენება მოთხოვნების სიცოცხლის ციკლის მართვისა და goroutine-ების შესრულების კონტროლის მიზნით. ძირითადი გამოყენების შემთხვევები:
- გაუქმება: საშუალებას აძლევს გაუქმდეს კონკრეტული მოთხოვნის დაკავშირებული goroutine-ების ჯაჭვი. მაგალითად, კავშირის დახურვის ან დროის გასვლის დროს.
- დროის ზღვარი: ადგენს ოპერაციის შესრულების საბოლოო ვადას. თუ ოპერაცია დროულად არ დასრულდა, კონტექსტი გაუქმებულია. ეს თავიდან აცილებს უსასრულო მოლოდინს.
- მონაცემების გადაცემა: საშუალებას აძლევს გადმოსცეთ კონკრეტული მოთხოვნის მონაცემები (მაგალითად, მომხმარებლის ID, ტრასირების იდენტიფიკატორი) ფუნქციების ჯაჭვში მათი სიგნატურების შეცვლის გარეშე.
გამოყენების მაგალითები:
-
გაუქმება სიგნალით:
პაკეტი main იმპორტი ( "context" "fmt" "time" ) ფუნქცია worker(ctx context.Context, id int) { საკანში { არჩევა { საგანი <-ctx.Done(): fmt.Printf("მუშაკი %d შეწყდა\n", id) დაბრუნება სხვა: fmt.Printf("მუშაკი %d მუშაობს...\n", id) time.Sleep(500 * time.Millisecond) } } } ფუნქცია main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // გარანტირებული გაუქმება გადადი worker(ctx, 1) გადადი worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // კონტექსტის გაუქმება time.Sleep(500 * time.Millisecond) // დრო მივცეთ goroutine-ებს დასრულებისთვის } -
დროის ზღვარი:
პაკეტი main იმპორტი ( "context" "fmt" "time" ) ფუნქცია longOperation(ctx context.Context) შეცდომა { საკანში { საგანი <-time.After(3 * time.Second): // იმიტაცია ხანგრძლივი სამუშაოს fmt.Println("ოპერაცია წარმატებით დასრულდა") დაბრუნება nil სხვა <-ctx.Done(): fmt.Println("ოპერაცია გაუქმდა კონტექსტით:", ctx.Err()) დაბრუნება ctx.Err() } } ფუნქცია main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() შეცდომა := longOperation(ctx) თუ err != nil { fmt.Println("შეცდომა:", err) } } -
მონაცემების გადაცემა:
პაკეტი main იმპორტი ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" ფუნქცია processRequest(ctx context.Context) { მომხმარებლის ID := ctx.Value(userIDKey).(int) fmt.Printf("მოთხოვნის დამუშავება მომხმარებლის ID: %d\n", userID) // შემდეგი დამუშავება userID-ის გამოყენებით } ფუნქცია main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }