মডিউল পাঠ (5/5)
`context.context`: বাতিলকরণ এবং সময়সীমা
context প্যাকেজটি হল প্রচারের জন্য প্রকৃত মান
বাতিলকরণ, সময়সীমা এবং সুযোগ-সীমাবদ্ধ মান কল চেইন বরাবর,
একাধিক গোরুটিন জুড়ে। সমস্ত স্ট্যান্ডার্ড "নেটওয়ার্কিং" প্যাকেজ
(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.Done() পরিচালনা করতে হবে। অন্যথায় প্রসঙ্গটি "চালিত" এর জন্য কিছুই না
প্রথম প্যারামিটার কনভেনশন
func Fetch(ctx context.Context, url string) ([]byte, error) { ... }
// ^^^^^^^^^^^^^^^^^^^
// SEMPRE primo, mai dentro a una struct, mai opzionalectxসর্বদা প্রথম প্যারামিটার হিসাবে,ctxনামে।- কখনই
Contextএকটি স্ট্রাকচারের ক্ষেত্র হিসাবে রাখবেন না (খুব বিরল ব্যতিক্রম)। - কখনই
nilপাস করবেন না:context.TODO()একটি স্টাব হিসাবে ব্যবহার করুন।
context.WithValue: sparingly
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() যখন ক্লায়েন্ট
সংযোগ বিচ্ছিন্ন বা যখন হ্যান্ডলার ফিরে আসে। সবার কাছে প্রচার করে
ডাউনস্ট্রিম কল, অপারেশনের পুরো গাছটি বাতিল করা হয়েছে
ক্যাসকেড: সংযোগ বিচ্ছিন্ন করার পরে কোন নষ্ট কাজ নেই।
চেষ্টা করে দেখুন
context.Background() থেকে প্রাপ্ত 1-সেকেন্ডের টাইমআউট সহ একটি প্রসঙ্গ তৈরি করুন এবং স্থগিত রেখে কল বাতিল করতে ভুলবেন না।
ইঙ্গিত দেখান
`context.WithTimeout(parent, d)` রিটার্ন করে `(ctx, cancel)`; সবসময় কল বাতিল
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
প্রসঙ্গটি বাতিল হওয়ার জন্য অপেক্ষা করতে <-ctx.Done() ব্যবহার করুন।
ইঙ্গিত দেখান
`ctx.Done()` হল একটি চ্যানেল যা প্রসঙ্গ বাতিল হলে বন্ধ হয়ে যায়।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
নিয়ম অনুসারে, একটি ফাংশন স্বাক্ষরে ctx প্যারামিটার কোথায় যায়?
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()ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হলে বাতিল করা হয়েছে৷