GOLANG_BOOKS Telegram 1012
🔄 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



tgoop.com/golang_books/1012
Create:
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


Share with your friend now:
tgoop.com/golang_books/1012

View MORE
Open in Telegram


Telegram News

Date: |

According to media reports, the privacy watchdog was considering “blacklisting” some online platforms that have repeatedly posted doxxing information, with sources saying most messages were shared on Telegram. While the character limit is 255, try to fit into 200 characters. This way, users will be able to take in your text fast and efficiently. Reveal the essence of your channel and provide contact information. For example, you can add a bot name, link to your pricing plans, etc. How to build a private or public channel on Telegram? How to create a business channel on Telegram? (Tutorial) How to create a business channel on Telegram? (Tutorial)
from us


Telegram Golang Books
FROM American