Sobes.tech
Назад к вопросам
Senior
13

Как добавить контекст в метод Stop, чтобы можно было прерывать ожидание выполнения тасков с таймаутом?

Компании, где спрашивали
Cloud.ru

Ответ от нейросети

sobes.tech AI

Чтобы добавить контекст в метод Stop для возможности прерывания ожидания выполнения задач с таймаутом, нужно использовать context.Context из стандартной библиотеки Go.

Пример:

func (s *Service) Stop(ctx context.Context) error {
    done := make(chan struct{})

    go func() {
        // Здесь логика остановки, ожидание завершения тасков
        s.waitTasks() // блокирующий вызов
        close(done)
    }()

    select {
    case <-done:
        return nil // успешно завершено
    case <-ctx.Done():
        return ctx.Err() // прервано по таймауту или отмене
    }
}

Вызов метода с таймаутом:

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

err := service.Stop(ctx)
if err != nil {
    fmt.Println("Stop interrupted:", err)
}

Таким образом, если ожидание выполнения тасков длится дольше заданного таймаута, Stop прервётся и вернёт ошибку из контекста. Это позволяет контролировать время ожидания и корректно реагировать на отмену.