Функция 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,
которая возвращает канал для отслеживания отмены