தொகுதி பாடங்கள் (5/5)
`context.Context`: ரத்துசெய்தல் மற்றும் காலக்கெடு
context தொகுப்பு என்பது ** பிரச்சாரத்திற்கான நடைமுறை தரநிலையாகும்
ரத்துசெய்தல், காலக்கெடு மற்றும் வரம்புக்கு உட்பட்ட மதிப்புகள்** அழைப்பு சங்கிலியுடன்,
பல goroutineகள் முழுவதும். அனைத்து நிலையான "நெட்வொர்க்கிங்" தொகுப்புகள்
(net/http, database/sql, os/exec) context.Context ஐ ஏற்கவும்
அவர்களின் முதல் அளவுரு.
இடைமுகம்
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(): வரம்புக்குட்பட்ட மதிப்புகளின் தேடல் (குறைவாகப் பயன்படுத்தவும்).
நான்கு அடிப்படை செயல்பாடுகள்
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 உடன்) அக ஆதாரங்களை வெளியிட, இருந்தாலும்
சூழல் ஏற்கனவே காலாவதியாகிவிட்டது.
டைம்அவுட் பேட்டர்ன்
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() மூடப்பட்டது மற்றும்
செயல்பாடு செயல்பாட்டை நிறுத்த வேண்டும்.
சூழலுக்கு மதிப்பளித்து: முடிந்தது() என்பதைத் தேர்ந்தெடுக்கவும்
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 ஐக் கையாள வேண்டும். முடிந்தது()**. இல்லையெனில் சூழல் "பவர் ஆன்" ஆகும் ஒன்றுமில்லை.
முதல் அளவுரு மாநாடு
func Fetch(ctx context.Context, url string) ([]byte, error) { ... }
// ^^^^^^^^^^^^^^^^^^^
// SEMPRE primo, mai dentro a una struct, mai opzionalectxஎப்போதும் முதல் அளவுருவாக,ctxஎன்று பெயரிடப்பட்டது.- ஒருபோதும்
Contextஐ ஒரு struct இன் புலமாக (மிகவும் அரிதான விதிவிலக்குகள்) வைக்க வேண்டாம். - ஒருபோதும் கடந்து
nil:context.TODO()ஐ ஸ்டப்பாகப் பயன்படுத்தவும்.
சூழல்.மதிப்புடன்: சிக்கனமாக
type userKey struct{}
ctx := context.WithValue(ctx, userKey{}, currentUser)
// più sotto:
if u, ok := ctx.Value(userKey{}).(*User); ok { ... }வழிகாட்டுதல்கள்:
- கோரிக்கை நோக்கம் கொண்ட தரவுகளுக்கு மட்டும் (கோரிக்கை ஐடி, டிரேஸ் ஐடி, பயனர் அடையாளம்).
- செயல்பாட்டு அளவுருக்களுக்கு ஒருபோதும் வேண்டாம்: அவற்றை சாதாரணமாக அனுப்பவும்.
- மோதல்களைத் தவிர்க்க விருப்ப ஏற்றுமதி செய்யப்படாத வகையின் விசைகள்.
சங்கிலியுடன் பரப்புதல்
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()
துண்டிக்கப்படும் அல்லது கையாளுபவர் திரும்பும்போது. அதை அனைவருக்கும் பரப்புவதன் மூலம்
கீழ்நிலை அழைப்புகள், செயல்பாடுகளின் முழு மரமும் ரத்து செய்யப்படுகிறது
அடுக்கு: துண்டிக்கப்பட்ட பிறகு வேலை வீணாகாது.
முயற்சி செய்து பாருங்கள்
சூழலில் இருந்து பெறப்பட்ட 1-வினாடி காலக்கெடுவுடன் ஒரு சூழலை உருவாக்கவும். பின்புலம்() மற்றும் ஒத்திவைப்பதன் மூலம் ரத்துசெய்ய அழைக்கவும்.
குறிப்பைக் காட்டு
`context.WithTimeout(பெற்றோர், ஈ)` என்பது `(ctx, ரத்து)` என்பதை வழங்குகிறது எப்போதும் அழைப்பு ரத்து.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
சூழல் ரத்து செய்யப்படும் வரை காத்திருக்க, தேர்ந்தெடுத்ததில் <-ctx.Done() ஐப் பயன்படுத்தவும்.
குறிப்பைக் காட்டு
`ctx.Done()` என்பது சூழல் ரத்துசெய்யப்படும்போது மூடப்படும் சேனலாகும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
மரபுப்படி, ஒரு செயல்பாட்டு கையொப்பத்தில் ctx அளவுரு எங்கு செல்கிறது?
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()கிளையன்ட் துண்டிக்கப்பட்டால் ரத்துசெய்யப்பட்டது.