முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 7 · பாடம் 5 இன் 5பாடத்திட்டத்தில் 35/50~14 min
தொகுதி பாடங்கள் (5/5)

`context.Context`: ரத்துசெய்தல் மற்றும் காலக்கெடு

context தொகுப்பு என்பது ** பிரச்சாரத்திற்கான நடைமுறை தரநிலையாகும் ரத்துசெய்தல், காலக்கெடு மற்றும் வரம்புக்கு உட்பட்ட மதிப்புகள்** அழைப்பு சங்கிலியுடன், பல goroutineகள் முழுவதும். அனைத்து நிலையான "நெட்வொர்க்கிங்" தொகுப்புகள் (net/http, database/sql, os/exec) context.Context ஐ ஏற்கவும் அவர்களின் முதல் அளவுரு.

இடைமுகம்

Go
type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key any) any
}
  • Done(): சூழல் ரத்து செய்யப்படும் போது மூடப்பட்ட சேனல்.
  • Err(): ரத்து செய்வதற்கான காரணம் (context.Canceled அல்லது context.DeadlineExceeded).
  • Deadline(): விருப்ப காலக்கெடு.
  • Value(): வரம்புக்குட்பட்ட மதிப்புகளின் தேடல் (குறைவாகப் பயன்படுத்தவும்).

நான்கு அடிப்படை செயல்பாடுகள்

Go
ctx := context.Background()              // radice: usalo in main, init, test
ctx := context.TODO()                    // "non so ancora": stub esplicito

ctx, cancel := context.WithCancel(parent)               // cancel manuale
ctx, cancel := context.WithTimeout(parent, d)           // scadenza relativa
ctx, cancel := context.WithDeadline(parent, t)          // scadenza assoluta

ctx := context.WithValue(parent, key, value)            // valore scope-bound

அனைத்து பெறப்பட்ட படிவங்களும் cancel செயல்பாட்டை வழங்கும்: எப்போதும் அதை அழைக்கவும் (defer உடன்) அக ஆதாரங்களை வெளியிட, இருந்தாலும் சூழல் ஏற்கனவே காலாவதியாகிவிட்டது.

டைம்அவுட் பேட்டர்ன்

Go
func fetchUser(id string) (*User, error) {
    ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
    defer cancel()

    return queryUser(ctx, id)   // queryUser deve rispettare ctx
}

queryUser 2 வினாடிகளுக்கு மேல் எடுத்தால், ctx.Done() மூடப்பட்டது மற்றும் செயல்பாடு செயல்பாட்டை நிறுத்த வேண்டும்.

சூழலுக்கு மதிப்பளித்து: முடிந்தது() என்பதைத் தேர்ந்தெடுக்கவும்

Go
func slowWork(ctx context.Context) error {
    for {
        select {
        case <-ctx.Done():
            return ctx.Err()      // canceled o deadline exceeded
        case <-time.After(100 * time.Millisecond):
            // un tick di lavoro
        }
    }
}

விதி: எங்கு உங்கள் செயல்பாடு நீண்ட நேரம் தடுக்கலாம் ** ctx ஐக் கையாள வேண்டும். முடிந்தது()**. இல்லையெனில் சூழல் "பவர் ஆன்" ஆகும் ஒன்றுமில்லை.

முதல் அளவுரு மாநாடு

Go
func Fetch(ctx context.Context, url string) ([]byte, error) { ... }
//        ^^^^^^^^^^^^^^^^^^^
// SEMPRE primo, mai dentro a una struct, mai opzionale
  • ctx எப்போதும் முதல் அளவுருவாக, ctx என்று பெயரிடப்பட்டது.
  • ஒருபோதும் Context ஐ ஒரு struct இன் புலமாக (மிகவும் அரிதான விதிவிலக்குகள்) வைக்க வேண்டாம்.
  • ஒருபோதும் கடந்து nil: context.TODO() ஐ ஸ்டப்பாகப் பயன்படுத்தவும்.

சூழல்.மதிப்புடன்: சிக்கனமாக

Go
type userKey struct{}

ctx := context.WithValue(ctx, userKey{}, currentUser)
// più sotto:
if u, ok := ctx.Value(userKey{}).(*User); ok { ... }

வழிகாட்டுதல்கள்:

  • கோரிக்கை நோக்கம் கொண்ட தரவுகளுக்கு மட்டும் (கோரிக்கை ஐடி, டிரேஸ் ஐடி, பயனர் அடையாளம்).
  • செயல்பாட்டு அளவுருக்களுக்கு ஒருபோதும் வேண்டாம்: அவற்றை சாதாரணமாக அனுப்பவும்.
  • மோதல்களைத் தவிர்க்க விருப்ப ஏற்றுமதி செய்யப்படாத வகையின் விசைகள்.

சங்கிலியுடன் பரப்புதல்

Go
func handleHTTP(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()   // context legato al ciclo di vita della richiesta
    user, err := fetchUser(ctx, r.URL.Query().Get("id"))
    if err != nil { ... }
    // ...
}

கிளையன்ட் இருக்கும்போது net/http தானாகவே ரத்துசெய்யும் r.Context() துண்டிக்கப்படும் அல்லது கையாளுபவர் திரும்பும்போது. அதை அனைவருக்கும் பரப்புவதன் மூலம் கீழ்நிலை அழைப்புகள், செயல்பாடுகளின் முழு மரமும் ரத்து செய்யப்படுகிறது அடுக்கு: துண்டிக்கப்பட்ட பிறகு வேலை வீணாகாது.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#go.m7.l5.e1
முயற்சிகள்: 0ஏற்றுகிறது…

சூழலில் இருந்து பெறப்பட்ட 1-வினாடி காலக்கெடுவுடன் ஒரு சூழலை உருவாக்கவும். பின்புலம்() மற்றும் ஒத்திவைப்பதன் மூலம் ரத்துசெய்ய அழைக்கவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

`context.WithTimeout(பெற்றோர், ஈ)` என்பது `(ctx, ரத்து)` என்பதை வழங்குகிறது எப்போதும் அழைப்பு ரத்து.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m7.l5.e2
முயற்சிகள்: 0ஏற்றுகிறது…

சூழல் ரத்து செய்யப்படும் வரை காத்திருக்க, தேர்ந்தெடுத்ததில் <-ctx.Done() ஐப் பயன்படுத்தவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

`ctx.Done()` என்பது சூழல் ரத்துசெய்யப்படும்போது மூடப்படும் சேனலாகும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m7.l5.e3
தயார்

மரபுப்படி, ஒரு செயல்பாட்டு கையொப்பத்தில் ctx அளவுரு எங்கு செல்கிறது?

Go
func Fetch(???, url string) ([]byte, error)
பதில் விருப்பங்கள்

மறுபரிசீலனை

  • context.Context ரத்துசெய்தல், காலக்கெடு மற்றும் வரம்புக்குட்பட்ட மதிப்புகளைப் பரப்புகிறது.
  • Background()/TODO() ரூட்டாக; WithCancel/WithTimeout/WithDeadline பெற.
  • ஆதாரங்களை வெளியிட எப்போதும் defer cancel().
  • "நீண்ட" செயல்பாடுகள் ctx.Done() இல் select அல்லது நிலையான தொகுப்புகளுக்கு ctx ஐ அனுப்ப வேண்டும்.
  • மாநாடு: ctx முதல் அளவுருவாக, ஒரு கட்டமைப்பிற்குள் இல்லை.
  • WithValue கோரிக்கை நோக்கம் கொண்ட தரவுகளுக்கு மட்டுமே (கோரிக்கை ஐடி, டிரேஸ் ஐடி).
  • net/http இல், r.Context() கிளையன்ட் துண்டிக்கப்பட்டால் ரத்துசெய்யப்பட்டது.