Функция context.AfterFunc
Функция context.AfterFunc регистрирует функцию для выполнения
в отдельной горутине после того, как контекст будет отменен.
В первый параметр передается контекст, за которым нужно наблюдать.
Во второй параметр передается функция типа func(),
которая будет вызвана после отмены контекста.
Функция возвращает func() bool - функцию остановки,
которая при вызове отменяет регистрацию и возвращает true,
если она успела отменить регистрацию до вызова переданной функции.
Синтаксис
stop := context.AfterFunc(ctx, func() {
// код, выполняемый после отмены контекста
})
Пример
Давайте создадим контекст и зарегистрируем функцию, которая будет вызвана после его отмены:
package 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)
}
Результат выполнения кода:
"context canceled"
Пример
Давайте зарегистрируем функцию и отменим ее регистрацию до того, как контекст будет отменен:
package 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)
}
Результат выполнения кода:
"stop succeeded"
Пример
Давайте покажем, что функция вызывается только один раз, даже если контекст отменяется несколько раз:
package 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()
}
Результат выполнения кода:
"callback executed only once"
Смотрите также
-
функцию
context.WithCancel,
которая создает контекст с функцией отмены -
функцию
context.WithTimeout,
которая создает контекст с таймаутом -
функцию
context.WithDeadline,
которая создает контекст с дедлайном -
функцию
context.Context.Done,
которая возвращает канал для отслеживания отмены контекста