Вы можете управлять незавершенными операциями с помощью Go context.Context. Контекст - это стандартное значение данных Go, которое может сообщать, была ли общая операция, которую он представляет, отменена и больше не нужна. Передавая context.Context между вызовами функций и сервисами в вашем приложении, они могут перестать работать раньше и возвращать ошибку, когда их обработка больше не требуется.
Например, вы можете захотеть:
- Завершить длительные операции, включая операции с базой данных, выполнение которых занимает слишком много времени.
- Распространять запросы на отмену из других источников, например, когда клиент закрывает соединение.
Многие API-интерфейсы для разработчиков Go включают методы, которые принимают аргумент Context, что упрощает использование контекста во всем приложении.
Отмена операций с базой данных после таймаута
Вы можете использовать контекст, чтобы установить таймаут или крайний срок, по истечении которого операция будет отменена. Чтобы получить контекст с таймаутом или крайним сроком, вызовите context.WithTimeout или context.WithDeadline.
Код в следующем примере таймаута извлекает контекст и передает его в метод sql.DB QueryContext.
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()
// Обрабатываем возвращенные строки.
}
Когда один контекст является производным от внешнего контекста, поскольку queryCtx является производным от ctx в этом примере, если внешний контекст отменяется, то производный контекст также автоматически отменяется. Например, в HTTP-серверах метод http.Request.Context возвращает контекст, связанный с запросом. Этот контекст отменяется, если HTTP-клиент отключает или отменяет HTTP-запрос (возможно в HTTP/2). Передача контекста HTTP-запроса в QueryWithTimeout выше приведет к преждевременной остановке запроса к базе данных либо в том случае, если общий HTTP-запрос был отменен, либо если запрос занял более пяти секунд.
Примечание. Всегда откладывайте (defer) вызов функции отмены, которая возвращается при создании нового контекста с таймаутом или крайним сроком. Это освобождает ресурсы, удерживаемые новым контекстом, при выходе из содержащей его функции. Он также отменяет queryCtx, но к тому времени, когда функция вернется, уже ничто не должно использовать queryCtx.
Читайте также:
- Доступ к реляционной базе данных c Golang
- Работа с реляционными базами данных с Golang
- Запрос данных из базы данных с пакетом database/sql в Golang
- Использование подготовленных операторов с пакетом database/sql в Golang
- Выполнение транзакций с пакетом database/sql в Golang
- Паттерны конкурентности в Golang: Context
Комментариев нет:
Отправить комментарий