Вести с Полей
Канал с советами по современной ИИ разработке. Вступайте!
1358 of 1593 menu
◀ ▶

Функция context.WithDeadline

Функция context.WithDeadline создает новый контекст с привязкой к конкретному моменту времени. Она принимает родительский контекст и время, после которого контекст должен быть отменен. Функция возвращает новый контекст и функцию отмены. Если указанное время уже наступило или наступит раньше, чем время отмены родительского контекста, то новый контекст будет отменен в указанное время. В противном случае он будет отменен вместе с родительским контекстом.

Синтаксис

ctx, cancel := context.WithDeadline(parent, deadline)

где parent - родительский контекст, deadline - время, после которого контекст будет отменен.

Пример

Давайте создадим контекст с крайним сроком выполнения и проверим его поведение:

package main import ( "context" "fmt" "time" ) func main() { deadline := time.Now().Add(2 * time.Second) ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel() select { case <-time.After(3 * time.Second): fmt.Println("Operation completed") case <-ctx.Done(): fmt.Println("Context canceled:", ctx.Err()) } }

Результат выполнения кода:

"Context canceled: context deadline exceeded"

Пример

Давайте проверим, как работает контекст с крайним сроком при успешном выполнении операции:

package main import ( "context" "fmt" "time" ) func main() { deadline := time.Now().Add(5 * time.Second) ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel() select { case <-time.After(2 * time.Second): fmt.Println("Operation completed successfully") case <-ctx.Done(): fmt.Println("Context canceled:", ctx.Err()) } }

Результат выполнения кода:

"Operation completed successfully"

Пример

Давайте создадим контекст с крайним сроком, который уже наступил:

package main import ( "context" "fmt" "time" ) func main() { deadline := time.Now().Add(-1 * time.Second) ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel() select { case <-time.After(1 * time.Second): fmt.Println("Operation completed") case <-ctx.Done(): fmt.Println("Context canceled:", ctx.Err()) } }

Результат выполнения кода:

"Context canceled: context deadline exceeded"

Смотрите также

  • функцию context.WithTimeout,
    которая создает контекст с таймаутом
  • функцию context.WithCancel,
    которая создает контекст с возможностью ручной отмены
  • функцию context.WithDeadlineCause,
    которая позволяет указать причину отмены
  • функцию context.Context.Done,
    которая возвращает канал для отслеживания отмены
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить