tg-me.com/golang_books/1012
Last Update:
🔄 Cascading Context Cancellation в Go: от исходников к продакшену
В статье подробно разобрано, как Go управляет цепочками отмен Context
— от базового кода до продакшен-паттернов.
🧠 Как устроена отмена Context
внутри Go
1. При создании cancelCtx
функция propagateCancel
делает так, чтобы отмена родителя передавалась детям.
2. Если родитель — тоже cancelCtx
, он хранит список потомков в children map
и пробрасывает cancel(...)
при отмене.
3. Если родитель имеет AfterFunc
, используется таймер; иначе создаётся горутина, которая ждёт <-parent.Done()
и вызывает cancel
.
Структура cancelCtx
:
type cancelCtx struct {
Context
mu sync.Mutex
done atomic.Value
children map[canceler]struct{}
err atomic.Value
cause error
}
🧪 WithCancelCause — отмена с причиной
Позволяет указывать причину отмены вместо обычного
context.Canceled
. Пример:
ctx, cancel := context.WithCancelCause(base)
cancel(errors.New("my custom reason"))
fmt.Println(ctx.Err(), context.Cause(ctx))
Причина отмены наследуется дочерними контекстами.
🧵 Безопасность в многопоточности
Методы
Done()
и Err()
потокобезопасны благодаря мьютексам и атомикам. CancelFunc
можно вызывать многократно — только первый вызов имеет эффект.⏰ AfterFunc — код по отмене
Позволяет запускать функцию, когда контекст отменяется:
stop := context.AfterFunc(ctx, func() {
tx.Rollback()
})
...
if stop() { log.Println("cancel handler stopped") }
Если контекст уже отменён — функция вызовется немедленно.
stop()
может отменить выполнение функции.🚫 WithoutCancel — фоновые задачи без отмены
Полезно, если горутина не должна завершаться при отмене родителя.
Важно:
Done() == nil
→ чтение из канала блокирует навсегда.⏲️ Таймеры: WithDeadline и WithTimeout
Функции создают контексты, которые отменяются автоматически по истечении времени.
Не забудьте делать
defer cancel()
после создания!✅ Практические советы
ctx, cancel := context.WithTimeout(parent, 100*time.Millisecond)
defer cancel()
Всегда вызывайте
cancel()
для освобождения ресурсов и предотвращения утечек.🧰 Что в итоге
Этот материал охватывает:
• внутреннее устройство
cancelCtx
• новые API:
WithCancelCause
, AfterFunc
, WithoutCancel
• продакшен-паттерны безопасной отмены
📖 Полный текст статьи: https://dev.to/flew1x/cascading-context-cancellation-in-go-from-source-code-to-production-patterns-177j
@golang_books
BY Golang Books
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/golang_books/1012