Функция context.WithDeadline

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

Синтаксис

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

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

Пример

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

gopackage 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())
  }
}

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

go"Context canceled: context deadline exceeded"

Пример

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

gopackage 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())
  }
}

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

go"Operation completed successfully"

Пример

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

gopackage 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())
  }
}

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

go"Context canceled: context deadline exceeded"

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

  • функцию context.WithTimeout,
    которая создает контекст с таймаутом
  • функцию context.WithCancel,
    которая создает контекст с возможностью ручной отмены
  • функцию context.WithDeadlineCause,
    которая позволяет указать причину отмены
  • функцию context.Context.Done,
    которая возвращает канал для отслеживания отмены