Конкурентность в Go

Go context: Cancellation and Timeouts

Stop work that takes too long or is no longer needed with context.WithTimeout and WithCancel.

  • Продвинутый
  • Чтение: 3 мин
  • Примеров для запуска: 1
Что вы узнаете
  • context.WithTimeout
  • ctx.Done()
  • context.WithCancel
Timeout of 50 ms
5 ms of worknil, finished in time
500 ms of workcontext deadline exceeded
after stop()context canceled

A cancellation signal passed down

A context carries a cancellation signal through your program. Functions that may take a long time accept a context and stop when it is cancelled or its deadline passes.

WithTimeout creates a context that is cancelled after 50 milliseconds. slowOperation waits for either its work or ctx.Done(), whichever comes first, and returns ctx.Err() when the context wins. WithCancel returns a function that cancels the context by hand.

Главное

  1. A context is cancelled by a deadline or by hand.
  2. ctx.Done() is a channel that closes on cancel.
  3. ctx.Err() says why.

Пример на Go, который можно запустить

Go
Запустить код →
main.go
package main

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

func slowOperation(ctx context.Context, duration time.Duration) error {
	select {
	case <-time.After(duration):
		return nil
	case <-ctx.Done():
		return ctx.Err()
	}
}

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

	fmt.Println("quick:", slowOperation(ctx, 5*time.Millisecond))
	fmt.Println("slow:", slowOperation(ctx, 500*time.Millisecond))

	manual, stop := context.WithCancel(context.Background())
	stop()
	fmt.Println("cancelled:", slowOperation(manual, time.Second))
}
Получить кнопку запуска для этого примера Результат выполнения
quick: <nil>
slow: context deadline exceeded
cancelled: context canceled

Практика

Откройте пример в онлайн-компиляторе, измените значение или добавьте строку и попробуйте предсказать вывод до запуска. Затем намеренно сломайте код и прочитайте сообщение компилятора.

Закончили этот урок?

Отметьте его как изученный, чтобы следить за прогрессом.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи