Отмена Goroutine может быть сделана с использованием контекста. Если вам нужно отменить предыдущую процедуру, запустите ее с контекстом и отмените ее при запуске новой. Вы должны написать программу для периодической проверки контекста:
var ctx context.Context
var cancel context.CancelFunc
for i := 0; i < 5; i++ {
if cancel!=nil {
// cancel previous goroutine
cancel()
}
ctx,cancel=context.WithCancel(context.Background())
// start goroutine with a new context
go handleRequest(i,ctx)
time.Sleep(1 * time.Second) // Time between requests
}
if cancel!=nil {
cancel()
}
В вашей процедуре вы должны проверить для отмены:
func handleRequest(ctx context.Context,incr int) {
fmt.Println("New request registered: ", incr + 1)
for i := 0; i <= 3; i++ {
fmt.Println("Request: ", incr + 1, " | Sub-task: ", i + 1)
time.Sleep(2 * time.Second) // Time processing
select {
case <-ctx.Done():
// canceled
return
default:
// not canceled
}
}
return
}