Функция context.AfterFunc

Функция context.AfterFunc регистрирует функцию для выполнения в отдельной горутине после того, как контекст будет отменен. В первый параметр передается контекст, за которым нужно наблюдать. Во второй параметр передается функция типа func(), которая будет вызвана после отмены контекста. Функция возвращает func() bool - функцию остановки, которая при вызове отменяет регистрацию и возвращает true, если она успела отменить регистрацию до вызова переданной функции.

Синтаксис

gostop := context.AfterFunc(ctx, func() {
  // код, выполняемый после отмены контекста
})

Пример

Давайте создадим контекст и зарегистрируем функцию, которая будет вызвана после его отмены:

gopackage main

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

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

  stop := context.AfterFunc(ctx, func() {
    fmt.Println("context canceled")
  })
  defer stop()

  time.Sleep(3 * time.Second)
}

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

go"context canceled"

Пример

Давайте зарегистрируем функцию и отменим ее регистрацию до того, как контекст будет отменен:

gopackage main

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

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

  stop := context.AfterFunc(ctx, func() {
    fmt.Println("this will not be printed")
  })

  if stop() {
    fmt.Println("stop succeeded")
  }

  time.Sleep(6 * time.Second)
}

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

go"stop succeeded"

Пример

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

gopackage main

import (
  "context"
  "fmt"
)

func main() {
  ctx, cancel := context.WithCancel(context.Background())

  context.AfterFunc(ctx, func() {
    fmt.Println("callback executed only once")
  })

  cancel()
  cancel()
  cancel()
}

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

go"callback executed only once"

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

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