𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
ಹೆಚ್ಚಿನ Go డెవలపರು context.Context ಅನ್ನು ಸರಿಯಾಗಿ ಅರ್ಥಮಾಡಿಕೊಳ್ಳದೆ ಬಳಸುತ್ತಾರೆ. ನೀವು ಇದನ್ನು HTTP handlers, database calls ಮತ್ತು SDK methodsಗಳಲ್ಲಿ ನೋಡಬಹುದು. ಅನೇಕ ಆರಂಭಿಕರು ಎಲ್ಲೆಡೆ context.Background() ಅನ್ನು ಬಳಸುತ್ತಾರೆ.
ಈ ತಪ್ಪಿನಿಂದ ಸಮಸ್ಯೆಗಳು ಉಂಟಾಗಬಹುದು. ಒಂದು Lambda function ತನ್ನ timeout ಸಮಯ ಮೀರಿ hang ಆಗಬಹುದು. ಬಳಕೆದಾರರು ಡಿಸ್ಕನೆಕ್ಟ್ ಆದ ನಂತರವೂ ಒಂದು database query ಚಾಲನೆಯಲ್ಲೇ ಇರಬಹುದು.
Context ನಿಮ್ಮ ಕೋಡ್ ಮೂಲಕ cancellation signals ಮತ್ತು deadlines ಅನ್ನು ಕಳುಹಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಈ ಮೂರು ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ:
• ಈ operation ಚಾಲನೆಯಲ್ಲೇ ಇರಬೇಕೇ? • ಈ operation ಯಾವಾಗ ಮುಗಿಯಬೇಕು? • ಈ call ನೊಂದಿಗೆ ಯಾವ request data ಹರಿಯುತ್ತದೆ?
Context interface ನಲ್ಲಿ ನಾಲ್ಕು methods ಇವೆ:
Deadline(): context ಯಾವಾಗ cancel ಆಗುತ್ತದೆ ಎಂಬುದನ್ನು ನೀಡುತ್ತದೆ.Done(): context cancel ಆದಾಗ ಮುಚ್ಚುವ channel ಅನ್ನು ನೀಡುತ್ತದೆ. ಕೆಲಸವನ್ನು ನಿಲ್ಲಿಸಲು select statements ನಲ್ಲಿ ಇದನ್ನು ಬಳಸಿ.Err(): context ಏಕೆ ನಿಂತಿತು ಎಂಬುದನ್ನು ನೀಡುತ್ತದೆ (DeadlineExceeded ಅಥವಾ Canceled).Value(): Trace ID ನಂತಹ request-scoped data ಅನ್ನು ಪಡೆಯುತ್ತದೆ.
Context ಒಂದು ಮರದಂತೆ (tree) ಕೆಲಸ ಮಾಡುತ್ತದೆ. ನೀವು ಒಂದು parent context ನೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸಿ, ಅದರ ಮಕ್ಕಳು (children) context ಗಳನ್ನು ರಚಿಸುತ್ತೀರಿ.
Root Contexts:
context.Background(): ಇದನ್ನು ನಿಮ್ಮ ಪ್ರೋಗ್ರಾಂನ ಆರಂಭದಲ್ಲಿ ಬಳಸಿ.context.TODO(): refactoring ಮಾಡುವಾಗ ಇದನ್ನು placeholder ಆಗಿ ಬಳಸಿ.
Child Contexts:
context.WithCancel(): ಕೆಲಸವನ್ನು ಮ್ಯಾನುಯಲ್ ಆಗಿ ನಿಲ್ಲಿಸಲು ಅನುಮತಿಸುತ್ತದೆ.context.WithTimeout(): ನಿರ್ದಿಷ್ಟ ಅವಧಿಯ ನಂತರ ಕೆಲಸವನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ.context.WithDeadline(): ನಿರ್ದಿಷ್ಟ ಸಮಯದಲ್ಲಿ ಕೆಲಸವನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ.context.WithValue(): User IDs ನಂತಹ metadata ಅನ್ನು ವರ್ಗಾಯಿಸುತ್ತದೆ.
ಪ್ರಮುಖ ನಿಯಮ: ಯಾವಾಗಲೂ cancel function ಅನ್ನು ಕರೆಯಿರಿ. child context ರಚಿಸಿದ ತಕ್ಷಣ defer cancel() ಬಳಸಿ. ನೀವು ಇದನ್ನು ಬಿಟ್ಟರೆ, memory leaks ಉಂಟಾಗಬಹುದು.
Best Practices:
- context ಅನ್ನು function ಗಳ ಮೊದಲ argument ಆಗಿ ಕಳುಹಿಸಿ.
- context ಅನ್ನು structs ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಬೇಡಿ.
context.WithValueಅನ್ನು metadata ಗಾಗಿ ಮಾತ್ರ ಬಳಸಿ, database clients ನಂತಹ dependencies ಗಾಗಿ ಅಲ್ಲ.- ಬೇಗನೆ ಹೊರಬರಲು (exit early) ಉದ್ದವಾದ loops ಗಳ ಒಳಗೆ
ctx.Err()ಅನ್ನು ಪರಿಶೀಲಿಸಿ. - collisions ತಪ್ಪಿಸಲು context keys ಗಾಗಿ custom types ಬಳಸಿ.
ಒಂದು parent context cancel ಆದಾಗ, ಅದರ ಎಲ್ಲಾ children context ಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ cancel ಆಗುತ್ತವೆ. ಇದು ನಿಮ್ಮ ಇಡೀ ಸಿಸ್ಟಮ್ನಲ್ಲಿನ ಸಂಪೂರ್ಣ chain of operations ಅನ್ನು ನಿಲ್ಲಿಸುವುದನ್ನು ಸುಲಭಗೊಳಿಸುತ್ತದೆ.