چینلز کے ساتھ Go Concurrency میں مہارت حاصل کریں
میں نے ایک بار Go میں ایک امیج پروسیسنگ پائپ لائن بنائی تھی۔
میں نے ہر مرحلے کے لیے goroutines کا استعمال کیا۔ میں نے انہیں channels کے ذریعے جوڑا۔ میں نے اسے رن (run) کیا۔
پروگرام جم گیا۔ میموری کا استعمال بڑھ گیا۔ پھر یہ بند ہو گیا۔ کوئی ایرر (error) نہیں تھا۔ صرف خاموشی تھی۔
میں نے ایک خراب شیڈیولر (scheduler) کو ڈی بگ (debug) کرنے میں گھنٹوں ضائع کیے۔ میں غلط تھا۔ میں نہیں سمجھتا تھا کہ channels کیسے کام کرتے ہیں۔
اپنے Go پروگرامز کو ہینگ (hang) ہونے سے روکنے کے لیے یہاں تین اصول دیے گئے ہیں۔
- Nil channels بلیک ہولز (black holes) کی طرح ہیں ایک nil channel ہمیشہ کے لیے بلاک ہو جاتا ہے۔ اگر آپ nil channel پر کچھ بھیجتے یا وصول کرتے ہیں، تو goroutine پھنس جاتی ہے۔
- اپنے channels کو ہمیشہ
makeکے ساتھ انیشلائز (initialize) کریں۔ - اگر آپ کو یقین نہ ہو تو nil چیک کا استعمال کریں۔
- کلوزنگ (closing) کے اصول پینکس (panics) سے بچاتے ہیں چینل کو کلوز کرنا مستقل عمل ہے۔
- صرف بھیجنے والے (sender) کو ہی چینل کلوز کرنا چاہیے۔
- کلوز شدہ چینل پر ڈیٹا بھیجنے سے panic پیدا ہوتا ہے۔
- یہ چیک کرنے کے لیے کہ آیا چینل کلوز ہو چکا ہے، دوسرے ریٹرن ویلیو کا استعمال کریں:
v, ok := <-ch۔ - اگر
okغلط (false) ہے، تو چینل کلوز ہو چکا ہے۔
- حفاظت کے لیے چینل کی سمتوں (directions) کا استعمال کریں Go آپ کو یہ بتانے کی اجازت دیتا ہے کہ چینل بھیجنے کے لیے ہے یا وصول کرنے کے لیے۔
chan<- intکا مطلب ہے کہ آپ صرف ڈیٹا بھیج سکتے ہیں۔<-chan intکا مطلب ہے کہ آپ صرف ڈیٹا وصول کر سکتے ہیں۔- یہ کمپائلر کو آپ کا کوڈ چلانے سے پہلے غلطیوں کو پکڑنے پر مجبور کرتا ہے۔
ایک صاف ستھری پائپ لائن کیسے بنائیں:
- یہ یقینی بنانے کے لیے کہ چینل صرف ایک بار کلوز ہو،
defer closeکا استعمال کریں۔ - چینلز پر لوپ (loop) کرنے کے لیے
rangeکا استعمال کریں۔ یہ چینل کلوز ہونے پر خود بخود رک جاتا ہے۔ - سخت معاہدے (strict contracts) بنانے کے لیے اپنے فنکشنز کو ڈائریکشن ٹائپس (direction types) تفویض کریں۔
جب آپ ان پیٹرنز (patterns) پر عمل کرتے ہیں، تو آپ لیکس (leaks) اور پینکس (panics) سے بچتے ہیں۔ آپ ایسے سسٹم بناتے ہیں جنہیں ٹیسٹ کرنا آسان اور مضبوط (robust) ہوتا ہے۔
آپ کا چیلنج:
ایک ایسا فنکشن لکھیں جو متعدد ان پٹ چینلز کو ایک آؤٹ پٹ چینل میں ضم (merge) کر دے۔ select لوپ کا استعمال کریں۔ 500ms کا ٹائم آؤٹ (timeout) شامل کریں۔ یقینی بنائیں کہ کوئی goroutine لیک نہ ہو۔
اپنا حل کمنٹس میں پوسٹ کریں۔