Контекст позволяет посылать сигнал отмены асинхронному процессу/программе go-routine.
контекст
Методы, предоставляемые интерфейсом контекста:-
Value(key) Этот метод возвращает значение, связанное с указанным ключом.
**Done() **Этот метод возвращает канал, который может быть использован для получения уведомления об отмене.
Deadline() Этот метод возвращает Time, представляющий крайний срок выполнения запроса, и значение bool, которое будет равно false, если крайний срок не был указан.
Err() Этот метод возвращает ошибку, которая указывает, почему канал Done получил сигнал. Пакет context определяет две переменные, которые могут быть использованы для сравнения ошибки: Canceled указывает, что запрос был отменен, а DeadlineExeeded указывает, что срок истек.
Функции https://pkg.go.dev/context#pkg-functions
- Background()
- WithCancel(ctx)
- WithDeadline(ctx,time)
- WithTimeout(ctx,duration)
- WithValue(ctx, key, val)
package main
import (
"sync"
"time"
"fmt"
"context"
)
func processRequest(ctx context.Context, wg *sync.WaitGroup, count int) {
total := 0
for i := 0; i < count; i++ {
select {
case <-ctx.Done():
fmt.Println("Stopping processing - request cancelled")
goto end
default:
fmt.Printf("Processing request: %v n", total)
total++
time.Sleep(time.Millisecond * 250)
}
}
fmt.Println("%v Request processed...", total)
end:
wg.Done()
}
func main() {
waitGroup := sync.WaitGroup{}
waitGroup.Add(1)
fmt.Println("Request dispatched...")
ctx, cancel := context.WithCancel(context.Background())
go processRequest(ctx, &waitGroup, 10)
time.Sleep(time.Second)
fmt.Println("Canceling req")
cancel()
waitGroup.Wait()
}
---
% go run contxt.go
Request dispatched...
Processing request: 0
Processing request: 1
Processing request: 2
Processing request: 3
Canceling request
Stopping processing - request cancelled