context

Source: https://habr.com/ru/company/nixys/blog/461723/

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ (Context)

ΠŸΠ°ΠΊΠ΅Ρ‚ context Π² go позволяСт Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ «контСкстС». ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚, Π΄Π΅Π΄Π»Π°ΠΉΠ½ ΠΈΠ»ΠΈ ΠΊΠ°Π½Π°Π», сигнализируСт ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ return.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ссли Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π²Π΅Π±-запрос ΠΈΠ»ΠΈ выполняСтС ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ΄Π΅Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ для production-grade систСм. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, Ссли API, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π²Ρ‹ вряд Π»ΠΈ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒ запросы Ρƒ сСбя Π² систСмС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ собствСнных запросов. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ каскадный эффСкт.

И здСсь ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ контСкст Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° ΠΈΠ»ΠΈ Π΄Π΅Π΄Π»Π°ΠΉΠ½Π°.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ контСкста

ΠŸΠ°ΠΊΠ΅Ρ‚ context позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ контСкст ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ способами:

Background

Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ пустой контСкст. Она Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅ (Π² main ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ запросов Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ уровня). Он ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для получСния Π΄Ρ€ΡƒΠ³ΠΈΡ… контСкстов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ обсудим ΠΏΠΎΠ·ΠΆΠ΅.

// Background returns an empty Context. It is never canceled, has no deadline,
// and has no values. Background is typically used in main, init, and tests,
// and as the top-level Context for incoming requests.
ctx := context.Background()

TODO

Π­Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ Background'Ρƒ контСкст, Π½ΠΎ называСтся ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Он Π½ΡƒΠΆΠ΅Π½, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ контСкст Π±ΡƒΠ΄Π΅ΠΌ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ (ΠΊΠΎΠ³Π΄Π° опрСдСлимся, ΠΈΡ‰Π΅ΠΌ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ ΠΈ мСняСм Π½Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ контСкст):

ctx := context.TODO()

ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ контСкста

ΠžΡ‚ Background ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… контСкстов ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ контСксты:

// WithCancel returns a copy of parent whose Done channel is closed as soon as
// parent.Done is closed or cancel is called.
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)

// A CancelFunc cancels a Context.
type CancelFunc func()

// WithTimeout returns a copy of parent whose Done channel is closed as soon as
// parent.Done is closed, cancel is called, or timeout elapses. The new
// Context's Deadline is the sooner of now+timeout and the parent's deadline, if
// any. If the timer is still running, the cancel function releases its
// resources.
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

// WithValue returns a copy of parent whose Value method returns val for key.
func WithValue(parent Context, key interface{}, val interface{}) Context

Last updated