মূল কন্টেন্টে যান
মডিউল 7 · 5-এর পাঠ 5কোর্সে 35/50~14 min
মডিউল পাঠ (5/5)

`context.context`: বাতিলকরণ এবং সময়সীমা

context প্যাকেজটি হল প্রচারের জন্য প্রকৃত মান বাতিলকরণ, সময়সীমা এবং সুযোগ-সীমাবদ্ধ মান কল চেইন বরাবর, একাধিক গোরুটিন জুড়ে। সমস্ত স্ট্যান্ডার্ড "নেটওয়ার্কিং" প্যাকেজ (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.Done() পরিচালনা করতে হবে। অন্যথায় প্রসঙ্গটি "চালিত" এর জন্য কিছুই না

প্রথম প্যারামিটার কনভেনশন

Go
func Fetch(ctx context.Context, url string) ([]byte, error) { ... }
//        ^^^^^^^^^^^^^^^^^^^
// SEMPRE primo, mai dentro a una struct, mai opzionale
  • ctx সর্বদা প্রথম প্যারামিটার হিসাবে, ctx নামে।
  • কখনই Context একটি স্ট্রাকচারের ক্ষেত্র হিসাবে রাখবেন না (খুব বিরল ব্যতিক্রম)।
  • কখনই nil পাস করবেন না: context.TODO() একটি স্টাব হিসাবে ব্যবহার করুন।

context.WithValue: sparingly

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লোড হচ্ছে...

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)
উত্তরের বিকল্প

রিক্যাপ

  • context.Context বাতিলকরণ, সময়সীমা এবং সুযোগ-সীমাবদ্ধ মান প্রচার করে।
  • Background()/TODO() রুট হিসাবে; WithCancel/WithTimeout/WithDeadline প্রাপ্ত করার জন্য।
  • সম্পদ প্রকাশ করতে সর্বদা defer cancel()
  • "লং" ফাংশনগুলিকে select এ ctx.Done() বা স্ট্যান্ডার্ড প্যাকেজগুলিতে ctx পাস করতে হবে৷
  • কনভেনশন: ctx প্রথম প্যারামিটার হিসেবে, কখনোই কোনো কাঠামোর মধ্যে নয়।
  • WithValue শুধুমাত্র অনুরোধ-স্কোপড ডেটার জন্য (অনুরোধ আইডি, ট্রেস আইডি)।
  • net/http এ, r.Context() ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হলে বাতিল করা হয়েছে৷