💬 Что из себя представляют сигналы отмены в контексте пакета context?



Передача сигнала отмены — один из юзкейсов контекстов в Go. Допустим, нужно создать приложение, которое вызывает CreateFileWatcher(ctx context.Context, filename string) внутри другой горутины. Эта функция создает file watcher, который постоянно читает файл и отслеживает его обновления. Когда предоставленный контекст становится неактуальным или отменяется, эта функция обрабатывает его, чтобы закрыть дескриптор файла.



Наконец, когда происходит возврат из main, мы хотим, чтобы все обрабатывалось корректно путем закрытия этого файлового дескриптора. Поэтому нам нужно передать сигнал. Возможный подход — использовать context.WithCancel, возвращающий контекст (возвращается первая переменная), который отменяется после вызова функции cancel (возвращается вторая переменная):



func main() {

ctx, cancel := context.WithCancel(context.Background()) // создание контекста, который может быть отменен

defer cancel() // откладываем вызов cancel

go func() {

CreateFileWatcher(ctx, "foo.txt") // вызов функции с использованием созданного контекста

}()

// ...

}





Когда происходит возврат из main, происходит и вызов функции cancel для отмены контекста, переданного в CreateFileWatcher, — чтобы дескриптор файла корректно закрылся.