Один из способов отменить обработку в программе - это использовать отменяемый контекст: context.WithCancel
. Это дает вам контекст и функцию cancel
, которую вы можете использовать для уведомления программы, что она отменена. Программа должна периодически проверять контекст и завершать его, если он отменен.
Вы можете отслеживать программы, используя их контексты. Для каждой созданной вами подпрограммы вы можете создать отменяемый контекст и сохранить контекст и функцию cancel
в списке / карте, в которой хранятся ваши текущие задачи. Тогда ваши подпрограммы будут выглядеть так:
func executor(ctx context.Context) {
for {
// Do stuff
select {
case <-ctx.Done():
// terminate
default:
}
// Do more stuff
}
}
Вы должны время от времени опрашивать контекст, чтобы узнать, отменен ли он.
И вы запускаете подпрограмму следующим образом:
go func() {
ctx, cancel:=context.WithCancel(context.Background())
defer cancel()
// Store ctx and cancel in a map if you need to
executor(ctx)
// Remove stored context
}()
Когда вам нужно отменить запущенную программу, вызовите ее функцию cancel
, и она в конце концов завершится.