Есть ли способ защитить выполнение бизнес-логики от отмены контекста? Вот фрагмент кода для лучшего понимания моей проблемы
func main() {
ctx, cancel := context.WithCancel(context.Background())
go foo(ctx)
time.Sleep(time.Second * 3)
cancel()
}
func foo(ctx context.Context) {
// batch process data
// context cancel should not stop function execution
// in the middle of business logic
for i:= 0; i<10; i++ {
fmt.Println("START of business logic for ID:", i)
fmt.Println("Critical component")
fmt.Print("Saving changes to DB...")
time.Sleep(time.Second * 1)
fmt.Println("Done")
fmt.Println("END of business logic for ID:", i)
}
}
Вывод:
START of business logic for ID: 0
Critical component
Saving changes to DB...Done
END of business logic for ID: 0
START of business logic for ID: 1
Critical component
Saving changes to DB...Done
END of business logic for ID: 1
START of business logic for ID: 2
Critical component
Saving changes to DB...Done
END of business logic for ID: 2
Когда выполнение начинается в цикле for, оно не должно останавливаться, пока не завершит эту итерацию. Возможно ли это с использованием отмены контекста? или мне следует использовать другой подход, пожалуйста, предложите.
В чем именно заключается ваш вопрос? В вашем примере не используется контекст для вычисления чего-либо, поэтому неясно, в какой части этого вы запутались. Контекстная отмена отправляется по каналу в вашу подпрограмму go, поэтому то, как вы прервете ее выполнение, полностью зависит от вас.
он заканчивается, потому что ваша программа существует. Это не имеет ничего общего с контекстом. ты вообще им не пользовался.
@super Когда я прерываю, я контролирую, но что происходит, когда я прерываю свою бизнес-логику, то есть внутри цикла for. Я хочу, чтобы go не прерывал выполнение функции, пока она находится внутри цикла.
@ mh-cbon извините, в примере я не использовал контекст, но это также применимо к контексту. Например, как я могу предотвратить прерывание выполнения критического кода с помощью go, когда пользователь отменяет HTTP-запрос и контекст отменяется
под пользователем вы подразумеваете, что кто-то/что-то попадает на ваш http-сервер?
@ mh-cbon да, это одна из возможностей
@abhijitwakchaure Прерывание всегда под вашим контролем. Вы получаете сигнал прерывания от канала и выбираете, какие действия предпринять для прерывания.
Как отметил @mh-cbon, программа естественным образом завершает работу независимо от отмены контекста. Лучше запускать задачу из основной горутины, а отмену инициировать из вспомогательной горутины. Ниже приведен пример детской площадки.
Спасибо всем за ваши быстрые ответы.