مرکزی مواد پر جائیں
ماڈیول 7 · سبق 5 از 5کورس میں 35/50~14 min
ماڈیول اسباق (5/5)

'context.Context': منسوخی اور آخری تاریخ

context پیکیج پروپیگنڈہ کرنے کے لیے اصل معیار ہے کال چین کے ساتھ منسوخی، ڈیڈ لائنز اور دائرہ کار کی پابند اقدار، متعدد goroutines بھر میں. تمام معیاری "نیٹ ورکنگ" پیکجز (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() بند ہے اور فنکشن کو آپریشن کو ختم کرنا ہوگا۔

سیاق و سباق کا احترام کرتے ہوئے: 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.Done() کو ہینڈل کرنا چاہیے۔ بصورت دیگر سیاق و سباق "پاور آن" کے لیے ہے۔ کچھ نہیں

پہلا پیرامیٹر کنونشن

Go
func Fetch(ctx context.Context, url string) ([]byte, error) { ... }
//        ^^^^^^^^^^^^^^^^^^^
// SEMPRE primo, mai dentro a una struct, mai opzionale
  • ctx ALWAYS پہلے پیرامیٹر کے طور پر، جس کا نام ctx ہے۔
  • کبھی نہیں Context کو کسی ڈھانچے کے فیلڈ کے طور پر نہ ڈالیں (بہت نایاب استثناء)۔
  • کبھی نہیں پاس نہ کریں nil: context.TODO() کو بطور اسٹب استعمال کریں۔

context.WithValue: تھوڑا سا

Go
type userKey struct{}

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

رہنما خطوط:

  • صرف درخواست کے دائرہ کار ڈیٹا کے لیے (درخواست ID، ٹریس ID، صارف کی شناخت)۔
  • فنکشن پیرامیٹرز کے لئے کبھی نہیں: انہیں عام طور پر پاس کریں۔
  • تصادم سے بچنے کے لیے کسٹم نان ایکسپورٹ قسم کی چابیاں۔

سلسلہ کے ساتھ ساتھ تبلیغ

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لوڈ ہو رہا ہے…

context.Background() سے اخذ کردہ 1 سیکنڈ کے ٹائم آؤٹ کے ساتھ ایک سیاق و سباق بنائیں اور ڈیفر کے ساتھ کال کینسل کرنا یاد رکھیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

`context.WithTimeout(parent, d)` ریٹرن `(ctx, cancel)`; ہمیشہ کال منسوخ کریں.

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m7.l5.e2
کوششیں: 0لوڈ ہو رہا ہے…

سیاق و سباق کے منسوخ ہونے کا انتظار کرنے کے لیے انتخاب میں <-ctx.Done() استعمال کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

`ctx.Done()` ایک ایسا چینل ہے جو سیاق و سباق کے منسوخ ہونے پر بند ہو جاتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m7.l5.e3
تیار

کنونشن کے مطابق، فنکشن کے دستخط میں ctx پیرامیٹر کہاں جاتا ہے؟

Go
func Fetch(???, url string) ([]byte, error)
جواب کے اختیارات

Recap

  • context.Context منسوخی، ڈیڈ لائن اور دائرہ کار کی قدروں کا پرچار کرتا ہے۔
  • Background()/TODO() بطور جڑ؛ WithCancel/WithTimeout/WithDeadline حاصل کرنا۔
  • وسائل جاری کرنے کے لیے ہمیشہ defer cancel()۔
  • "طویل" فنکشنز کو select پر ctx.Done() یا معیاری پیکجوں میں ctx پاس کرنا چاہئے۔
  • کنونشن: ctx بطور FIRST پیرامیٹر، کبھی بھی ساخت کے اندر نہیں۔
  • WithValue صرف درخواست کے دائرہ کار والے ڈیٹا کے لیے (درخواست ID، ٹریس ID)۔
  • net/http میں، r.Context() کلائنٹ کے منقطع ہونے پر منسوخ ہو گیا ہے۔