Отмена выполняющихся операций

Вы можете управлять выполняющимися операциями, используя стандартный пакет Go context.Context. Context — это стандартное значение данных в Go, которое может сообщать, была ли отменена целевая операция и больше не требуется. Передавая context.Context между вызовами функций и сервисами в вашем приложении, вы можете заставить эти компоненты преждевременно прекратить работу и вернуть ошибку, когда их обработка больше не нужна. Более подробно о Context можно прочитать в статье Go Concurrency Patterns: Context.

Например, вы можете захотеть:

  • Завершить длительные операции, включая операции с базой данных, которые выполняются слишком долго.
  • Распространить запросы на отмену извне, например, когда клиент закрывает соединение.

Многие API для разработчиков на Go включают методы, которые принимают аргумент Context, что облегчает использование Context по всему приложению.

Отмена операций с базой данных после истечения времени ожидания

Вы можете использовать Context для установки времени ожидания или крайнего срока, после которого операция будет отменена. Чтобы создать Context с временем ожидания или сроком, вызовите context.WithTimeout или context.WithDeadline.

В следующем примере кода создается Context с временем ожидания и передается в метод QueryContext типа sql.DB.

<code>func QueryWithTimeout(ctx context.Context) {
  // Создаем Context с таймаутом.
  queryCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
  defer cancel()

  // Передаем Context с таймаутом в запрос.
  rows, err := db.QueryContext(queryCtx, "SELECT * FROM album")
  if err != nil {
    log.Fatal(err)
  }
  defer rows.Close()

  // Обрабатываем возвращаемые строки.
}
</code>

Когда один контекст порождается из внешнего контекста, как в примере queryCtx порождается из ctx, при отмене внешнего контекста производный контекст также автоматически отменяется. Например, в HTTP-серверах метод http.Request.Context возвращает контекст, связанный с запросом. Этот контекст отменяется, если HTTP-клиент отключается или отменяет HTTP-запрос (возможно в HTTP/2). Передача контекста HTTP-запроса в функцию QueryWithTimeout, показанную выше, приведёт к преждевременному завершению запроса к базе данных либо при отмене всего HTTP-запроса, либо если запрос занял более пяти секунд.

Примечание: Всегда откладывайте вызов функции cancel, которая возвращается при создании нового Context с таймаутом или дедлайном. Это освобождает ресурсы, занятые новым Context, когда содержащая функция завершает выполнение. Это также отменяет queryCtx, но к моменту возврата функцией, ничего больше не должно использовать queryCtx.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang