𝗚𝗼 𝗖𝗼𝗻𝘁𝗲𝘅𝘁 𝗣𝗮𝗰𝗸𝗮𝗴𝗲
ਜ਼ਿਆਦਾਤਰ Go developers context.Context ਦੀ ਵਰਤੋਂ ਇਸਨੂੰ ਸਮਝੇ ਬਿਨਾਂ ਕਰਦੇ ਹਨ। ਤੁਸੀਂ ਇਸਨੂੰ HTTP handlers, database calls, ਅਤੇ SDK methods ਵਿੱਚ ਦੇਖਦੇ ਹੋ। ਬਹੁਤ ਸਾਰੇ ਸ਼ੁਰੂਆਤੀ (beginners) ਹਰ ਜਗ੍ਹਾ context.Background() pass ਕਰਦੇ ਹਨ।
ਇਹ ਗਲਤੀ ਸਮੱਸਿਆਵਾਂ ਪੈਦਾ ਕਰਦੀ ਹੈ। ਇੱਕ Lambda function ਆਪਣੇ timeout ਤੋਂ ਬਾਅਦ ਵੀ ਲਟਕ (hang) ਸਕਦਾ ਹੈ। ਇੱਕ database query ਉਦੋਂ ਵੀ ਚੱਲਦੀ ਰਹਿ ਸਕਦੀ ਹੈ ਜਦੋਂ ਯੂਜ਼ਰ ਡਿਸਕਨੈਕਟ ਹੋ ਜਾਵੇ।
Context ਤੁਹਾਨੂੰ ਆਪਣੇ ਕੋਡ ਰਾਹੀਂ cancellation signals ਅਤੇ deadlines ਭੇਜਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਇਹ ਤੁਹਾਨੂੰ ਤਿੰਨ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਦੇਣ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ:
• ਕੀ ਇਹ operation ਚੱਲਦਾ ਰਹਿਣਾ ਚਾਹੀਦਾ ਹੈ? • ਇਹ operation ਕਦੋਂ ਖਤਮ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ? • ਇਸ call ਦੇ ਨਾਲ ਕਿਹੜਾ request data ਜਾ ਰਿਹਾ ਹੈ?
Context interface ਵਿੱਚ ਚਾਰ methods ਹਨ:
- Deadline(): ਦੱਸਦਾ ਹੈ ਕਿ context ਕਦੋਂ cancel ਹੋਵੇਗਾ।
- Done(): ਇੱਕ channel ਵਾਪਸ ਕਰਦਾ ਹੈ ਜੋ context cancel ਹੋਣ 'ਤੇ ਬੰਦ ਹੋ ਜਾਂਦਾ ਹੈ। ਕੰਮ ਰੋਕਣ ਲਈ select statements ਵਿੱਚ ਇਸਦੀ ਵਰਤੋਂ ਕਰੋ।
- Err(): ਦੱਸਦਾ ਹੈ ਕਿ context ਕਿਉਂ ਰੁਕਿਆ (DeadlineExceeded ਜਾਂ Canceled)।
- Value(): Trace ID ਵਰਗਾ request-scoped data ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ।
Context ਇੱਕ tree ਵਾਂਗ ਕੰਮ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਇੱਕ parent context ਤੋਂ ਸ਼ੁਰੂ ਕਰਦੇ ਹੋ ਅਤੇ children ਬਣਾਉਂਦੇ ਹੋ।
Root Contexts:
- context.Background(): ਇਸਦੀ ਵਰਤੋਂ ਆਪਣੇ ਪ੍ਰੋਗਰਾਮ ਦੀ ਸ਼ੁਰੂਆਤ ਵਿੱਚ ਕਰੋ।
- context.TODO(): refactoring ਦੌਰਾਨ ਇਸਨੂੰ ਇੱਕ placeholder ਵਜੋਂ ਵਰਤੋ।
Child Contexts:
- context.WithCancel(): ਤੁਹਾਨੂੰ ਕੰਮ ਨੂੰ ਮੈਨੂਅਲੀ ਰੋਕਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ।
- context.WithTimeout(): ਇੱਕ ਖਾਸ ਸਮੇਂ (duration) ਤੋਂ ਬਾਅਦ ਕੰਮ ਰੋਕ ਦਿੰਦਾ ਹੈ।
- context.WithDeadline(): ਇੱਕ ਖਾਸ ਸਮੇਂ 'ਤੇ ਕੰਮ ਰੋਕ ਦਿੰਦਾ ਹੈ।
- context.WithValue(): User IDs ਵਰਗਾ metadata pass ਕਰਦਾ ਹੈ।
ਅਹਿਮ ਨਿਯਮ: ਹਮੇਸ਼ਾ cancel function ਨੂੰ ਕਾਲ ਕਰੋ। Child context ਬਣਾਉਣ ਤੋਂ ਤੁਰੰਤ ਬਾਅਦ defer cancel() ਦੀ ਵਰਤੋਂ ਕਰੋ। ਜੇਕਰ ਤੁਸੀਂ ਇਸਨੂੰ ਛੱਡ ਦਿੰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ memory leaks ਪੈਦਾ ਕਰਦੇ ਹੋ।
Best Practices:
- Functions ਨੂੰ ਪਹਿਲੇ argument ਵਜੋਂ context pass ਕਰੋ।
- Context ਨੂੰ structs ਵਿੱਚ ਸਟੋਰ ਨਾ ਕਰੋ।
- context.WithValue ਦੀ ਵਰਤੋਂ ਸਿਰਫ਼ metadata ਲਈ ਕਰੋ, database clients ਵਰਗੇ dependencies ਲਈ ਨਹੀਂ।
- ਜਲਦੀ ਬਾਹਰ ਨਿਕਲਣ ਲਈ ਲੰਬੇ loops ਦੇ ਅੰਦਰ ctx.Err() ਚੈੱਕ ਕਰੋ।
- Collisions ਤੋਂ ਬਚਣ ਲਈ context keys ਲਈ custom types ਦੀ ਵਰਤੋਂ ਕਰੋ।
ਜਦੋਂ ਇੱਕ parent context cancel ਹੁੰਦਾ ਹੈ, ਤਾਂ ਉਸਦੇ ਸਾਰੇ children ਆਪਣੇ ਆਪ cancel ਹੋ ਜਾਂਦੇ ਹਨ। ਇਹ ਤੁਹਾਡੇ ਪੂਰੇ ਸਿਸਟਮ ਵਿੱਚ operations ਦੀ ਪੂਰੀ ਲੜੀ (chain) ਨੂੰ ਰੋਕਣਾ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ।