𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
చాలా మంది Go డెవలపర్లు context.Context గురించి పూర్తిగా అర్థం చేసుకోకుండానే దానిని ఉపయోగిస్తారు. HTTP హ్యాండ్లర్లు, డేటాబేస్ కాల్స్ మరియు SDK మెథడ్స్లో మీరు దీనిని చూడవచ్చు. చాలా మంది బిగినర్స్ ప్రతిచోటా context.Background() ను ఉపయోగిస్తారు.
ఈ తప్పు వల్ల సమస్యలు తలెత్తుతాయి. ఒక Lambda ఫంక్షన్ దాని టైమ్ అవుట్ (timeout) దాటిన తర్వాత కూడా హ్యాంగ్ (hang) అవ్వచ్చు. యూజర్ డిస్కనెక్ట్ అయిన తర్వాత కూడా ఒక డేటాబేస్ క్వెరీ రన్ అవుతూనే ఉండవచ్చు.
Context మీ కోడ్ ద్వారా క్యాన్సిలేషన్ సిగ్నల్స్ (cancellation signals) మరియు డెడ్లైన్స్ను (deadlines) పంపడానికి అనుమతిస్తుంది. ఇది ఈ మూడు ప్రశ్నలకు సమాధానం ఇవ్వడంలో మీకు సహాయపడుతుంది:
• ఈ ఆపరేషన్ కొనసాగించాలా? • ఈ ఆపరేషన్ ఎప్పటికి ముగియాలి? • ఈ కాల్తో పాటు ఏ రిక్వెస్ట్ డేటా ప్రవహిస్తుంది?
Context ఇంటర్ఫేస్లో నాలుగు మెథడ్స్ ఉన్నాయి:
Deadline(): context ఎప్పుడు క్యాన్సిల్ అవుతుందో తెలియజేస్తుంది.Done(): context క్యాన్సిల్ అయినప్పుడు క్లోజ్ అయ్యే ఒక ఛానెల్ను (channel) అందిస్తుంది. పనిని ఆపడానికి దీనినిselectస్టేట్మెంట్లలో ఉపయోగించండి.Err(): context ఎందుకు ఆగిపోయిందో తెలియజేస్తుంది (DeadlineExceededలేదాCanceled).Value():Trace IDవంటి రిక్వెస్ట్-స్కోప్ డేటాను పొందుతుంది.
Context ఒక చెట్టు (tree) లాగా పనిచేస్తుంది. మీరు ఒక పేరెంట్ context తో ప్రారంభించి, దాని నుండి చైల్డ్ (child) contextలను సృష్టిస్తారు.
Root Contexts:
context.Background(): మీ ప్రోగ్రామ్ ప్రారంభంలో దీనిని ఉపయోగించండి.context.TODO(): రిఫ్యాక్టరింగ్ (refactoring) సమయంలో దీనిని ప్లేస్హోల్డర్గా ఉపయోగించండి.
Child Contexts:
context.WithCancel(): పనిని మాన్యువల్గా ఆపడానికి అనుమతిస్తుంది.context.WithTimeout(): ఒక నిర్దిష్ట సమయం తర్వాత పనిని ఆపుతుంది.context.WithDeadline(): ఒక నిర్దిష్ట సమయంలో పనిని ఆపుతుంది.context.WithValue(): User IDs వంటి మెటాడేటాను పంపిస్తుంది.
ముఖ్యమైన నియమం: ఎల్లప్పుడూ cancel ఫంక్షన్ను కాల్ చేయండి. చైల్డ్ contextను సృష్టించిన వెంటనే defer cancel() ను ఉపయోగించండి. మీరు దీనిని వదిలేస్తే, మెమరీ లీక్స్ (memory leaks) ఏర్పడతాయి.
Best Practices:
- ఫంక్షన్లకు మొదటి ఆర్గ్యుమెంట్గా contextను పంపండి.
- contextను structsలో నిల్వ చేయవద్దు.
context.WithValueను కేవలం మెటాడేటా కోసం మాత్రమే ఉపయోగించండి, డేటాబేస్ క్లయింట్లు వంటి డిపెండెన్సీల కోసం కాదు.- త్వరగా బయటకు రావడానికి (exit early) లాంగ్ లూప్ల (long loops) లోపల
ctx.Err()ను తనిఖీ చేయండి. - కొలిజన్లను (collisions) నివారించడానికి context కీల కోసం కస్టమ్ టైప్స్ను ఉపయోగించండి.
ఒక పేరెంట్ context క్యాన్సిల్ అయినప్పుడు, దానిలోని అన్ని చైల్డ్ contextలు ఆటోమేటిక్గా క్యాన్సిల్ అవుతాయి. దీనివల్ల మీ మొత్తం సిస్టమ్లోని ఆపరేషన్ల గొలుసును (chain of operations) సులభంగా ఆపవచ్చు.