𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
பெரும்பாலான Go டெவலப்பர்கள் context.Context-ஐப் பற்றி முழுமையாகப் புரிந்துகொள்ளாமல் பயன்படுத்துகிறார்கள். HTTP handlers, database calls மற்றும் SDK methods ஆகியவற்றில் இதைக் காணலாம். பல தொடக்கநிலை டெவலப்பர்கள் எல்லா இடங்களிலும் context.Background()-ஐப் பயன்படுத்துகிறார்கள்.
இந்தத் தவறு சிக்கல்களை உண்டாக்கும். ஒரு Lambda function அதன் timeout காலத்தைத் தாண்டியும் இயங்கிக்கொண்டிருக்கலாம். ஒரு பயனர் துண்டிக்கப்பட்ட பின்னரும் (disconnect), ஒரு database query தொடர்ந்து இயங்கிக்கொண்டிருக்கலாம்.
Context உங்கள் குறியீடு (code) வழியாக ரத்து செய்யும் சிக்னல்கள் (cancellation signals) மற்றும் காலக்கெடுவை (deadlines) அனுப்ப அனுமதிக்கிறது. இது பின்வரும் மூன்று கேள்விகளுக்குப் பதிலளிக்க உதவுகிறது:
• இந்தச் செயல்பாடு தொடர்ந்து இயங்க வேண்டுமா? • இந்தச் செயல்பாடு எப்பொழுது முடிய வேண்டும்? • இந்த அழைப்புடன் (call) எந்தக் கோரிக்கைத் தரவு (request data) செல்கிறது?
Context interface-இல் நான்கு முறைகள் (methods) உள்ளன:
Deadline(): context எப்போது ரத்து செய்யப்படும் என்பதைக் குறிக்கும்.Done(): context ரத்து செய்யப்படும்போது மூடிக்கொள்ளும் ஒரு channel-ஐத் தரும். வேலையை நிறுத்த இதை select statements-இல் பயன்படுத்தவும்.Err(): context ஏன் நின்றது (DeadlineExceeded அல்லது Canceled) என்பதைக் குறிக்கும்.Value(): Trace ID போன்ற கோரிக்கை சார்ந்த தரவுகளை (request-scoped data) மீட்டெடுக்கப் பயன்படுகிறது.
Context ஒரு மரம் (tree) போலச் செயல்படுகிறது. நீங்கள் ஒரு parent context-இல் தொடங்கி, அதன் கீழ் child contexts-களை உருவாக்குகிறீர்கள்.
Root Contexts:
context.Background(): உங்கள் நிரலின் (program) தொடக்கத்தில் இதைப் பயன்படுத்தவும்.context.TODO(): refactoring செய்யும் போது ஒரு placeholder ஆக இதைப் பயன்படுத்தவும்.
Child Contexts:
context.WithCancel(): வேலையைத் தானாகவே (manually) நிறுத்த அனுமதிக்கிறது.context.WithTimeout(): ஒரு குறிப்பிட்ட காலத்திற்குப் பிறகு வேலையை நிறுத்துகிறது.context.WithDeadline(): ஒரு குறிப்பிட்ட நேரத்தில் வேலையை நிறுத்துகிறது.context.WithValue(): User IDs போன்ற metadata-க்களைக் கடத்துகிறது.
மிக முக்கியமான விதி: எப்போதும் cancel function-ஐ அழைக்கவும். ஒரு child context-ஐ உருவாக்கியவுடன் உடனடியாக defer cancel()-ஐப் பயன்படுத்தவும். இதைத் தவிர்த்தால், memory leaks ஏற்படக்கூடும்.
Best Practices:
- functions-களுக்கு முதல் argument ஆக context-ஐ அனுப்பவும்.
- context-ஐ structs-களில் சேமிக்க வேண்டாம்.
context.WithValue-ஐ metadata-க்களுக்கு மட்டுமே பயன்படுத்தவும்; database clients போன்ற dependencies-களுக்குப் பயன்படுத்த வேண்டாம்.- நீண்ட லூப்களுக்குள் (long loops) விரைவாக வெளியேற
ctx.Err()-ஐச் சரிபார்க்கவும். - collisions-களைத் தவிர்க்க context keys-களுக்குத் தனிப்பயன் வகைகளை (custom types) பயன்படுத்தவும்.
ஒரு parent context ரத்து செய்யப்படும்போது, அதன் அனைத்து child contexts-களும் தானாகவே ரத்து செய்யப்படும். இது உங்கள் முழு அமைப்பிலும் (system) உள்ள ஒரு தொடர்ச்சியான செயல்பாடுகளை (chain of operations) எளிதாக நிறுத்த உதவுகிறது.