Ограничение времени задач и graceful shutdown воркеров

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

gocontextgraceful shutdown

👁 В автоматизации на Go часто есть воркеры, которые обрабатывают задачи из очередей или cron’ов. Проблема возникает при деплое или остановке сервиса — воркеры либо обрываются посреди задачи, либо зависают. Правильный подход — управлять их жизненным циклом через context.

📝Управление воркерами с таймаутом и корректным завершением

package main

import (
  "context"
  "fmt"
  "time"
)

func worker(ctx context.Context, jobs <-chan int) {
  for {
    select {
    case job, ok := <-jobs:
      if !ok {
        return
      }
      fmt.Println("обработка:", job)
      time.Sleep(2 * time.Second)
    case <-ctx.Done():
      fmt.Println("остановка воркера")
      return
    }
  }
}

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

  jobs := make(chan int)

  go worker(ctx, jobs)

  for i := 1; i <= 5; i++ {
    jobs <- i
  }

  close(jobs)
  time.Sleep(6 * time.Second)
}

📌 Как это работает:

  • context.WithTimeout задаёт общее время жизни воркера и всех его операций.
  • В select воркер слушает и задачи, и сигнал завершения через ctx.Done().
  • При остановке сервиса воркер корректно завершает работу, не обрываясь в середине выполнения.

❗️ В автоматизации важно не только запускать задачи, но и уметь их правильно останавливать. Без context воркеры часто становятся источником утечек и некорректного поведения при деплое.

tags: #go #разработка

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот кода на Go с примером worker, использующим context.WithTimeout и select для graceful shutdown; тёмная тема, бренд RECURA на изображении.
Скриншот: пример кода воркера на Go с использованием context.WithTimeout для graceful shutdown.

Читайте так же