نوڈ جے ایس میں ایونٹ لوپ

Nw J Ays My Aywn Lwp



Node.js ایک طاقتور Javascript فریم ورک ہے جو صارفین کو براؤزر کے باہر سرور پر Javascript کوڈ چلانے کے قابل بناتا ہے۔ قابل بھروسہ توسیع پذیر ویب ایپلیکیشنز بنانے کے لیے یہ ایک غیر مسدود، ایونٹ پر مبنی رن ٹائم ماحول ہے۔ ایونٹ لوپ Node.js کا ایک اہم حصہ ہے جو آپ کو دوسرے کام شروع کرنے سے پہلے ایک کے ختم ہونے کا انتظار کیے بغیر کام کرنے کے قابل بناتا ہے۔

اگرچہ جاوا اسکرپٹ ایک واحد تھریڈڈ لینگویج ہے، لیکن Node.js آپریٹنگ سسٹم کو کام تفویض کر سکتا ہے، جس سے یہ ایک ہی وقت میں متعدد کاموں پر کارروائی کر سکتا ہے۔ کئی کاموں کو ایک ہی وقت میں مکمل کرنا پڑتا ہے کیونکہ آپریٹنگ سسٹم میں آپریشنز ملٹی تھریڈڈ ہوتے ہیں۔ ہر آپریشن سے وابستہ کال بیک کو ایونٹ کی قطار میں شامل کیا جاتا ہے اور مخصوص کام مکمل ہونے پر Node.js کے ذریعہ چلایا جاتا ہے۔

موثر اور قابل اعتماد Node.js کوڈ لکھنے کے لیے، صارف کو ایونٹ لوپس کی ٹھوس سمجھ ہونی چاہیے۔ یہ کارکردگی کے مسائل کو مؤثر طریقے سے حل کرنے میں بھی مدد کرسکتا ہے۔ Node.js میں ایونٹ لوپ میموری کو محفوظ کرتا ہے اور آپ کو ہر ایک کے ختم ہونے کا انتظار کیے بغیر ایک ساتھ متعدد کام کرنے کی اجازت دیتا ہے۔ اصطلاح 'غیر مطابقت پذیر' کسی بھی جاوا اسکرپٹ فنکشن سے مراد ہے جو آنے والی درخواستوں کو بلاک کیے بغیر پس منظر میں چلتا ہے۔







ایونٹ لوپس پر براہ راست کودنے سے پہلے آئیے جاوا اسکرپٹ پروگرامنگ زبان کے مختلف پہلوؤں پر ایک نظر ڈالیں۔



جاوا اسکرپٹ ایک غیر مطابقت پذیر پروگرامنگ زبان کے طور پر

آئیے ہم غیر مطابقت پذیر پروگرامنگ کے تصورات پر ایک نظر ڈالتے ہیں۔ جاوا اسکرپٹ ویب، موبائل اور ڈیسک ٹاپ ایپلی کیشنز میں استعمال ہوتا ہے، لیکن واضح رہے کہ جاوا اسکرپٹ ایک سنگل تھریڈڈ، سنکرونس کمپیوٹر پروگرامنگ لینگویج ہے۔



تصور کو سمجھنے کے لیے ایک سادہ کوڈ کی مثال دی گئی ہے۔





فنکشن کا طریقہ 1 ( ) {

تسلی. لاگ ( 'فنکشن 1' )

}

فنکشن کا طریقہ 2 ( ) {

تسلی. لاگ ( 'فنکشن 2' )

}

طریقہ 1 ( )

طریقہ 2 ( )

اس کوڈ میں، دو آسان فنکشنز بنائے گئے ہیں اور طریقہ1 کو پہلے کہا جاتا ہے تو یہ طریقہ 1 کو پہلے لاگ کرے گا اور پھر اگلے پر چلا جائے گا۔

آؤٹ پٹ



جاوا اسکرپٹ ایک ہم وقت ساز پروگرامنگ زبان کے طور پر

جاوا اسکرپٹ ایک ہم وقت ساز پروگرامنگ لینگویج ہے اور ایک وقت میں صرف ایک لائن کے ساتھ اوپر سے نیچے کی طرف بڑھتے ہوئے ہر سطر پر عمل درآمد کرتی ہے۔ اوپر دیئے گئے مثال کے کوڈ میں طریقہ 1 پہلے ٹرمینل میں لاگ ان ہوتا ہے اور پھر طریقہ 2۔

جاوا اسکرپٹ کو بلاک کرنے والی زبان کے طور پر

ہم وقت ساز زبان ہونے کی وجہ سے جاوا اسکرپٹ کو بلاک کرنے کی فعالیت ہوتی ہے۔ اس سے کوئی فرق نہیں پڑتا کہ ایک جاری عمل کو مکمل کرنے میں کتنا وقت لگتا ہے لیکن جب تک پچھلا عمل مکمل نہیں ہو جاتا ایک نیا عمل شروع نہیں کیا جائے گا۔ مندرجہ بالا کوڈ کی مثال میں فرض کریں کہ طریقہ 1 میں بہت زیادہ کوڈ اسکرپٹ ہے چاہے اس میں 10 سیکنڈ یا ایک منٹ کا کتنا وقت لگے طریقہ2 کو اس وقت تک عمل میں نہیں لایا جائے گا جب تک کہ طریقہ 1 میں موجود تمام کوڈ پر عمل نہ ہو جائے۔

براؤزنگ کے دوران صارفین نے اس کا تجربہ کیا ہوگا۔ جب ایک ویب ایپلیکیشن براؤزر میں بیک اینڈ پر عمل کرتی ہے تو کوڈ کا ایک بہت بڑا حصہ عمل میں لایا جاتا ہے لہذا براؤزر صارف کو کنٹرول رسائی واپس کرنے سے پہلے کچھ دیر کے لیے منجمد نظر آتا ہے۔ یہ رویہ بلاکنگ کے نام سے جانا جاتا ہے۔ موجودہ درخواست پر کارروائی ہونے تک براؤزر مزید آنے والی درخواستوں کو قبول نہیں کر سکتا۔

جاوا اسکرپٹ ایک واحد تھریڈ والی زبان ہے۔

جاوا اسکرپٹ میں کسی پروگرام کو چلانے کے لیے تھریڈ کی فعالیت کا استعمال کیا جاتا ہے۔ تھریڈز ایک وقت میں صرف ایک کام کرنے کے قابل ہیں۔ دیگر پروگرامنگ زبانیں ملٹی تھریڈنگ کو سپورٹ کرتی ہیں اور متوازی طور پر متعدد کاموں کو چلا سکتی ہیں، جاوا اسکرپٹ میں کسی بھی کوڈ اسکرپٹ کو چلانے کے لیے صرف ایک تھریڈ ہوتا ہے۔

جاوا اسکرپٹ میں انتظار کر رہا ہے۔

جیسا کہ اس سیکشن میں نام سے ظاہر ہے، ہمیں مزید آگے بڑھنے کے لیے ہماری درخواست پر کارروائی کا انتظار کرنا ہوگا۔ انتظار میں کئی منٹ لگ سکتے ہیں جس کے دوران مزید کوئی درخواست قبول نہیں کی جاتی ہے۔ اگر کوڈ اسکرپٹ بغیر انتظار کیے آگے بڑھتا ہے تو کوڈ میں ایک خرابی سامنے آئے گی۔ کوڈ کو غیر مطابقت پذیر بنانے کے لیے کچھ فعالیت جاوا اسکرپٹ یا خاص طور پر Node.js میں لاگو کی جانی ہے۔

اب جب کہ ہم جاوا اسکرپٹ کے مختلف پہلوؤں کو سمجھ چکے ہیں، آئیے کچھ آسان مثالوں سے ہم وقت ساز اور غیر مطابقت پذیر کو سمجھیں۔

جاوا اسکرپٹ میں کوڈ کا ہم وقت ساز عمل

ہم وقت ساز کا مطلب یہ ہے کہ کوڈ کو ترتیب وار یا اس سے بھی زیادہ آسان طریقے سے اوپر سے شروع کرکے اور نیچے لائن کی طرف منتقل کیا جاتا ہے۔

ذیل میں ایک مثال دی گئی ہے جس سے سمجھنے میں مدد مل سکتی ہے:

// application.js

تسلی. لاگ ( 'ایک' )

تسلی. لاگ ( 'دو' )

تسلی. لاگ ( 'تین' )

اس کوڈ میں، تین console.log بیانات ہیں جن میں سے ہر ایک کچھ پرنٹ کرتا ہے۔ سب سے پہلے پہلا بیان جو کنسول میں 'One' پرنٹ کرنے جا رہا ہے کال اسٹیک میں 1 ms (تخمینہ) کے لیے بھیجا جاتا ہے پھر اسے ٹرمینل پر لاگ ان کیا جاتا ہے۔ اس کے بعد، دوسرا سٹیٹمنٹ کال اسٹیک میں ڈال دیا جاتا ہے اور اب وقت 2 ایم ایس ہے جس میں پچھلے سے ایک کا اضافہ ہوتا ہے اور پھر یہ کنسول میں 'دو' لاگ کرتا ہے۔ آخر میں، آخری بیان کو کال اسٹیک میں دھکیل دیا جاتا ہے ابھی وقت 3ms ہے اور یہ کنسول میں 'Three' لاگ کرتا ہے۔

مندرجہ بالا کوڈ کو درج ذیل کمانڈ کو استعمال کر کے عمل میں لایا جا سکتا ہے۔

نوڈ کی درخواست. js

آؤٹ پٹ

کام کاج کو اوپر تفصیل سے بیان کیا گیا ہے اور اسے مدنظر رکھتے ہوئے آؤٹ پٹ پلک جھپکتے ہی کنسول میں لاگ ان ہو جاتا ہے۔

جاوا اسکرپٹ میں کوڈ کا غیر مطابقت پذیر عمل

اب آئیے کال بیکس متعارف کراتے ہوئے اور کوڈ کو غیر مطابقت پذیر بنا کر اسی کوڈ کو ری فیکٹر کریں۔ مندرجہ بالا کوڈ کو اس طرح ریفیکٹر کیا جا سکتا ہے:

// application.js
فنکشن پرنٹ ون ( کال بیک ) {
مقررہ وقت ( فنکشن ( ) {
تسلی. لاگ ( 'ایک' ) ;
کال بیک ( ) ;
} , 1000 ) ;
}
فنکشن پرنٹ ٹو ( کال بیک ) {
مقررہ وقت ( فنکشن ( ) {
تسلی. لاگ ( 'دو' ) ;
کال بیک ( ) ;
} , 2000 ) ;
}
فنکشن پرنٹ تھری ( ) {
مقررہ وقت ( فنکشن ( ) {
تسلی. لاگ ( 'تین' ) ;
} , 3000 ) ;
}
تسلی. لاگ ( 'پروگرام کا آغاز' ) ;
پرنٹ ایک ( فنکشن ( ) {
پرنٹ ٹو ( فنکشن ( ) {
پرنٹ تھری ( ) ;
} ) ;
} ) ;
تسلی. لاگ ( 'پروگرام کا اختتام' ) ;

مندرجہ بالا اس کوڈ میں:

  • 'ایک'، 'دو' اور 'تین' پرنٹ کرنے کے لیے تین فنکشنز کا اعلان کیا گیا ہے، ہر فنکشن میں کال بیک پیرامیٹر ہوتا ہے جو کوڈ کے ترتیب وار عمل درآمد کی اجازت دیتا ہے۔
  • ایک ٹائم آؤٹ سیٹ ٹائم آؤٹ فنکشن کا استعمال کرتے ہوئے سیٹ کیا جاتا ہے اور مخصوص تاخیر کے بعد پرنٹ کرنے کے لیے کنسول ڈاٹ لاگ اسٹیٹمنٹ موجود ہوتا ہے۔
  • دو پیغامات 'پروگرام کا آغاز' اور 'پروگرام کا اختتام' پرنٹ کیے گئے ہیں جو پروگرام کے آغاز اور اختتام کی نشاندہی کرتے ہیں۔
  • پروگرام کا آغاز 'پروگرام کا آغاز' پرنٹنگ سے ہوتا ہے جس کے بعد پرنٹ ون فنکشن 1 سیکنڈ کی تاخیر کے ساتھ عمل میں لایا جاتا ہے، پھر پرنٹ ٹو فنکشن 2 سیکنڈ کی تاخیر کے ساتھ انجام دیا جاتا ہے، اور آخر میں پرنٹ تھری فنکشن 3 سیکنڈ کی تاخیر کے ساتھ انجام دیا جاتا ہے۔ تاخیر
  • پروگرام سیٹ ٹائم آؤٹ فنکشنز کے اندر غیر مطابقت پذیر کوڈ کے عمل کا انتظار نہیں کرتا ہے جو ایک، دو اور تین پرنٹ کرنے سے پہلے 'پروگرام کے اختتام' کے بیان کو لاگ کرتا ہے۔

آؤٹ پٹ

ٹرمینل میں اس کمانڈ پر عمل کرتے ہوئے مذکورہ کوڈ کو چلائیں:

نوڈ کی درخواست. js

اب ٹرمینل میں آؤٹ پٹ متضاد طور پر اس طرح ظاہر ہوگا:

اب جب کہ ہم مطابقت پذیر اور غیر مطابقت پذیر عمل کی مکمل سمجھ رکھتے ہیں، آئیے Node.js میں ایونٹ لوپ کے اپنے تصور کو مستحکم کرنے کے لیے کودتے ہیں۔

Node.js: ایونٹ لوپ میکانزم

ہم وقت ساز اور غیر مطابقت پذیر دونوں کاموں کی انجام دہی کا انتظام Node.js میں ایونٹ لوپ کے ذریعے کیا جاتا ہے۔ جیسے ہی Node.js پروجیکٹ شروع ہوتا ہے اور پیچیدہ کاموں کو آسانی سے سسٹم میں منتقل کرتا ہے۔ یہ اس بات کو یقینی بناتا ہے کہ مرکزی دھاگے پر دوسرے کام آسانی سے چل سکتے ہیں۔

Node.js میں ایونٹ لوپ کی بصری وضاحت

Node.js میں ایونٹ لوپ مسلسل اور نیم لامحدود ہے۔ ایونٹ لوپ کو Node.js کوڈ اسکرپٹ کے آغاز سے شروع کیا جاتا ہے، اور یہ async API کالز کرنے اور کال کرنے کے عمل کے لیے ذمہ دار ہوتا ہے۔Tick()، اور ٹائمرز کو شیڈول کرنے کے بعد ایونٹ کے لوپ پر عمل درآمد دوبارہ شروع کرتا ہے۔

Node.js میں، قطاروں کی پانچ اہم اقسام کال بیکس کو ہینڈل کرتی ہیں:

  • 'ٹائمر قطار' جسے عام طور پر min-heap کہا جاتا ہے وہ 'setTimeout' اور 'setInterval' سے وابستہ کال بیکس کو سنبھالنے کے لیے ذمہ دار ہے۔
  • غیر مطابقت پذیر کارروائیوں کے لیے کال بیکس جیسے کہ 'fs' اور 'http' ماڈیولز کو 'I/O قطار' کے ذریعے سنبھالا جاتا ہے۔
  • 'Check Queue' میں 'setImmediate' فنکشن کے لیے کال بیکس شامل ہیں جو نوڈ کے لیے منفرد ہے۔
  • 'بند قطار' کسی بھی غیر مطابقت پذیر کام کے اختتامی ایونٹ سے وابستہ کال بیکس کا انتظام کرتی ہے۔
  • آخر میں، 'مائیکرو ٹاسک' قطار میں دو مختلف قطاریں ہیں:
    • 'nextTick' قطار میں 'process.nextTick' فنکشن سے وابستہ کال بیکس شامل ہیں۔
    • 'وعدہ' کی قطار مقامی وعدے سے متعلق کال بیکس کو کنٹرول کرتی ہے۔

Node.js میں ایونٹ لوپ کی فعالیت

ایونٹ لوپ مخصوص تقاضوں کے تحت کام کرتا ہے جو کال بیک ایگزیکیوشن آرڈر کو کنٹرول کرتا ہے۔ عمل کے آغاز پر صارف کے ہم وقت ساز جاوا اسکرپٹ کوڈ کو ترجیح دی جاتی ہے، اس لیے ایونٹ لوپ صرف اس وقت شروع ہوتا ہے جب کال اسٹیک صاف ہو جاتا ہے۔ مندرجہ ذیل عملدرآمد کی ترتیب ایک ساختی پیٹرن کی پیروی کرتی ہے:

مائیکرو ٹاسک قطار میں کال بیکس کو سب سے زیادہ ترجیح دی جاتی ہے پھر اگلی ٹِک قطار میں کاموں کو انجام دینے کے لیے آگے بڑھتے ہیں اور اس کے بعد وعدے کی قطار میں کام آتے ہیں۔ ٹائمر کی قطار کال بیکس کے عمل کو پھر سنبھالا جاتا ہے جس کے بعد ہر ٹائمر کال بیک کے بعد مائیکرو ٹاسک قطار دوبارہ دیکھی جاتی ہے۔ پھر I/O، چیک اور بند قطاروں میں کال بیکس کو ہر مرحلے کے بعد مائیکرو ٹاسک قطار کے ساتھ اسی طرز پر عمل میں لایا جاتا ہے۔

اگر عمل کرنے کے لیے مزید کال بیکس ہوں تو لوپ کا عمل جاری رہتا ہے۔ جب کوڈ اسکرپٹ ختم ہو جاتا ہے یا کوئی کال بیکس پر کارروائی کرنے کے لیے باقی نہیں رہتا ہے، تو ایونٹ لوپ مؤثر طریقے سے ختم ہو جاتا ہے۔

اب جب کہ ہم ایونٹ لوپ کو گہرائی سے سمجھتے ہیں، آئیے اس کی خصوصیات کو دیکھتے ہیں۔

Node.js میں ایونٹ لوپ کی خصوصیات

اہم خصوصیات یہ ہیں:

  • ایونٹ لوپ ایک لامحدود لوپ ہے اور جیسے ہی یہ ٹاسک وصول کرتا ہے اسے انجام دینا جاری رکھتا ہے اور کوئی ٹاسک نہ ہونے کی صورت میں سلیپ موڈ میں چلا جاتا ہے لیکن ٹاسک موصول ہوتے ہی کام کرنا شروع کر دیتا ہے۔
  • ایونٹ کی قطار میں کام صرف اس وقت انجام پاتے ہیں جب اسٹیک خالی ہو یعنی کوئی فعال آپریشن نہ ہو۔
  • ایونٹ لوپ میں کال بیکس اور وعدے استعمال کیے جا سکتے ہیں۔
  • جیسا کہ ایونٹ لوپ خلاصہ ڈیٹا ٹائپ قطار کے اصول کی پیروی کرتا ہے یہ پہلا کام پورا کرتا ہے پھر اگلے کام پر جاتا ہے۔

ایونٹ لوپ کی مکمل تفہیم کے بعد، اور متضاد اور ہم آہنگی کے عمل کی منطق کے بعد، مختلف مراحل کی سمجھ حاصل کرنا ایونٹ لوپ کے تصورات کو مستحکم کر سکتا ہے۔

Node.js ایونٹ لوپ فیزز

جیسا کہ اوپر ذکر کیا گیا ہے، ایونٹ لوپ نیم لامحدود ہے۔ اس کے بہت سے مراحل ہیں لیکن کچھ مراحل اندرونی ہینڈلنگ کے لیے استعمال ہوتے ہیں۔ ان مراحل کا کوڈ اسکرپٹ پر کوئی اثر نہیں ہوتا ہے۔

ایونٹ لوپ قطار کی فعالیت کی پیروی کرتا ہے اور کام کو فرسٹ ان اور فرسٹ آؤٹ کے اصول پر انجام دیتا ہے۔ طے شدہ ٹائمرز آپریٹنگ سسٹم کے ذریعہ سنبھالے جائیں گے جب تک کہ ان کی میعاد ختم نہ ہوجائے۔ اس کے بعد میعاد ختم ہونے والے ٹائمرز کو ٹائمرز کے لیے کال بیک قطار میں شامل کر دیا جاتا ہے۔

ایونٹ لوپ ٹائمر کی قطار میں ایک ایک کر کے کاموں کو اس وقت تک انجام دیتا ہے جب تک کہ مزید کام باقی نہ رہ جائیں یا یہ کاموں کی زیادہ سے زیادہ اجازت شدہ تعداد تک نہ پہنچ جائے۔ ذیل کے حصوں میں ایونٹ لوپس کے بنیادی مراحل کی وضاحت کی گئی ہے۔

ٹائمرز کا مرحلہ

Node.js میں ایک ٹائمر API ہے جو مستقبل میں انجام پانے والے فنکشنز کو شیڈول کر سکتا ہے۔ مختص کردہ وقت گزر جانے کے بعد ٹائمر کال بیک جیسے ہی وہ شیڈول کیا جا سکتا ہے انجام دے گا۔ تاہم، آپریٹنگ سسٹم کے اختتام سے یا دیگر کال بیکس کے عمل کی وجہ سے تاخیر کا سامنا کرنا پڑ سکتا ہے۔

ٹائمرز API کے تین اہم کام ہیں:

  • مقررہ وقت
  • فوری طور پر مقرر کریں
  • مقررہ وقفہ

مذکورہ بالا افعال مطابقت پذیر ہیں۔ ایونٹ لوپ میں ٹائمر کا مرحلہ سیٹ ٹائم آؤٹ اور سیٹ انٹروال فنکشنز تک محدود ہے۔ جبکہ چیک فنکشن setImmediate فنکشن کو ہینڈل کرتا ہے۔

آئیے نظریاتی حصے کو مستحکم کرنے کے لیے ایک سادہ مثال پر غور کریں:

// application.js

فنکشن delayedFunction ( ) {

تسلی. لاگ ( 'تاخیر کا فنکشن ٹائم آؤٹ کے بعد انجام دیا جاتا ہے' ) ;

}

تسلی. لاگ ( 'پروگرام کا آغاز' ) ;

مقررہ وقت ( تاخیر سے کام کرنا، 2000 ) ;

تسلی. لاگ ( 'پروگرام کا اختتام' ) ;

اس کوڈ میں:

  • پروگرام ٹرمینل پر 'پروگرام کا آغاز' کے بیان کو لاگ ان کرنے سے شروع ہوتا ہے۔
  • پھر delayedFunction کو 2ms کے ٹائمر کے ساتھ کال کیا جاتا ہے، کوڈ اسکرپٹ نہیں رکتا اور پس منظر میں تاخیر کو سنبھالنے کے لیے آگے بڑھتا ہے۔
  • بیان 'پروگرام کا اختتام پہلے بیان کے بعد لاگ ان ہوتا ہے۔
  • 2ms کی تاخیر کے بعد، delayedFunction میں بیان ٹرمینل پر لاگ ان ہوتا ہے۔

آؤٹ پٹ

آؤٹ پٹ اس طرح ظاہر ہوگا:

یہ دیکھا جا سکتا ہے کہ کوڈ کو تاخیر سے کام کرنے کے لیے روکا نہیں گیا ہے۔ یہ آگے بڑھتا ہے اور تاخیر کے بعد، فنکشن کال بیک پر کارروائی ہوتی ہے۔

زیر التواء کال بیکس

ایونٹ لوپ پولنگ کے مرحلے میں ہونے والے واقعات، جیسے فائلوں کو پڑھنا، نیٹ ورک کی سرگرمیاں، یا ان پٹ/آؤٹ پٹ کاموں کی جانچ کرتا ہے۔ یہ جاننا ضروری ہے کہ، Node.js میں، اس پولنگ مرحلے میں صرف کچھ واقعات ہینڈل کیے جاتے ہیں۔ تاہم، ایونٹ لوپ کے بعد کے تکرار میں، بعض واقعات کو زیر التواء مرحلے میں موخر کیا جا سکتا ہے۔ Node.js کوڈ کو بہتر بنانے اور ٹربل شوٹنگ کرتے وقت ذہن میں رکھنے کے لیے یہ ایک کلیدی تصور ہے جس میں ایونٹ سے چلنے والے پیچیدہ آپریشنز شامل ہیں۔

یہ سمجھنا ضروری ہے کہ کال بیکس کے انتظار کے مرحلے کے دوران، ایونٹ لوپ ملتوی واقعات کو زیر التواء کال بیکس کی قطار میں شامل کرتا ہے اور انہیں انجام دیتا ہے۔ یہ مرحلہ کچھ TCP ساکٹ کی خرابیوں کو بھی سنبھالتا ہے جو سسٹم نے پیدا کی ہیں، جیسے کہ بعض آپریٹنگ سسٹمز پر ECONNREFUSED ایرر ایونٹس۔

تصور کو مستحکم کرنے کے لیے ذیل میں ایک مثال کا ذکر کیا گیا ہے۔

// application.js
const fs = ضرورت ہے ( 'fs' ) ;
تقریب readFileAsync ( فائل پاتھ، کال بیک ) {
fs readFile ( './PromiseText.txt' , 'utf8' ، فنکشن ( غلطی، ڈیٹا ) {
اگر ( غلطی ) {
تسلی. غلطی ( ` خرابی فائل پڑھنا : $ { غلطی پیغام } ` ) ;
} اور {
تسلی. لاگ ( ` فائل مواد : $ { ڈیٹا } ` ) ;
}
کال بیک ( ) ;
} ) ;
}
تسلی. لاگ ( 'پروگرام کا آغاز' ) ;
readFileAsync ( './PromiseText.txt' ، فنکشن ( ) {
تسلی. لاگ ( 'فائل ریڈ کال بیک پر عمل درآمد کیا گیا' ) ;
} ) ;
تسلی. لاگ ( 'پروگرام کا اختتام' ) ;

اس کوڈ میں:

  • پروگرام کا آغاز ٹرمینل میں بیان 'پروگرام کا آغاز' لاگ ان کرکے کیا جاتا ہے۔
  • readFileAsync کو 'PromiseText.txt' فائل کے مواد کو پڑھنے کے لیے متضاد طور پر بیان کیا گیا ہے۔ یہ ایک پیرامیٹرائزڈ فنکشن ہے جو فائل کو پڑھنے کے بعد کال بیک فنکشن کو انجام دیتا ہے۔
  • readFileAsync فنکشن کو فائل پڑھنے کا عمل شروع کرنے کے لیے کہا جاتا ہے۔
  • فائل پڑھنے کے عمل میں، پروگرام نہیں رکتا؛ اس کے بجائے، یہ اگلے بیان پر جاتا ہے اور اسے ٹرمینل 'اینڈ آف دی پروگرام' میں لاگ کرتا ہے۔
  • فائل ریڈنگ کے غیر مطابقت پذیر ایونٹ کو ایونٹ لوپ کے ذریعے پس منظر میں پروسیس کیا جاتا ہے۔
  • فائل کو متضاد طور پر پڑھنے کے بعد اور مواد کو ٹرمینل میں لاگ ان کرنے کے بعد پروگرام فائل کے مواد کو ٹرمینل میں لاگ کرتا ہے۔ اس کے بعد، یہ درج ذیل پیغام کو لاگ کرتا ہے 'فائل ریڈ کال بیک ایکسیکیوٹڈ'۔
  • ایونٹ لوپ اگلے مرحلے میں زیر التواء کال بیک آپریشنز کو ہینڈل کرتا ہے۔

آؤٹ پٹ

مذکورہ بالا عمل کا نتیجہ یہ ہے:

بیکار، Node.js میں فیز تیار کریں۔

بیکار مرحلہ Node.js میں اندرونی افعال سے نمٹنے کے لیے استعمال ہوتا ہے لہذا یہ معیاری مرحلہ نہیں ہے۔ یہ کوڈ اسکرپٹ کو متاثر نہیں کرتا ہے۔ بیکار مرحلہ ایونٹ لوپ کے وقفے کی طرح ہوتا ہے جس کے دوران پس منظر میں کم ترجیحی کاموں کا انتظام ہوتا ہے۔ اس مرحلے کو سمجھنے کے لیے ایک سادہ سی مثال یہ ہے:

const { بیکار } = ضرورت ہے ( 'بیکار-جی سی' ) ;

بیکار نظر انداز کرنا ( ) ;

اس کوڈ میں، 'idle-gc' ماڈیول استعمال کیا جاتا ہے جو بیکار مرحلے کو نظر انداز کرنے کی اجازت دیتا ہے۔ یہ ان حالات کو سنبھالنے میں کام کرتا ہے جب ایونٹ کا لوپ مصروف ہوتا ہے اور پس منظر کے کام انجام نہیں پاتے ہیں۔ idle.ignore کے استعمال کو بہترین نہیں سمجھا جاتا کیونکہ یہ کارکردگی کے مسائل کا سبب بن سکتا ہے۔

Node.js میں پولنگ کا مرحلہ

Node.js میں پولنگ کا مرحلہ کام کرتا ہے:

  • یہ پول کی قطار میں ہونے والے واقعات کو سنبھالتا ہے اور ان کے متعلقہ کام انجام دیتا ہے۔
  • یہ فیصلہ کرتا ہے کہ عمل میں I/O آپریشنز کے انتظار اور جانچ پڑتال میں کتنا وقت گزارنا ہے۔

ٹائمر کی عدم موجودگی کی وجہ سے جیسے ہی ایونٹ لوپ پول کے مرحلے میں داخل ہوتا ہے، ذیل میں سے ایک کام انجام دیا جائے گا:

  • Node.js میں ایونٹ لوپ کے پول فیز میں، زیر التواء I/O ایونٹس کو قطار میں کھڑا کیا جاتا ہے اور پھر فرسٹ ان اور فرسٹ آؤٹ کے اصول پر عمل کرتے ہوئے ترتیب وار عمل میں لایا جاتا ہے جب تک کہ قطار خالی نہ ہو جائے۔ کال بیکس کے عمل کے دوران نیکسٹ ٹِک اور مائیکرو ٹاسک کی قطاریں بھی ایکشن میں ہیں۔ یہ ہمواری کو یقینی بناتا ہے اور I/O آپریشنز کو زیادہ موثر اور قابل اعتماد طریقے سے سنبھالنے کی اجازت دیتا ہے۔
  • اگر قطار خالی ہے اور اسکرپٹ کو setImmediate() فنکشن کے ذریعے شیڈول نہیں کیا گیا ہے تو ایونٹ لوپ ختم ہو جائے گا اور یہ اگلے مرحلے (چیک) پر چلا جائے گا۔ دوسری طرف، اگر اسکرپٹ کی شیڈولنگ setImmediate() فنکشن کے ذریعہ کی گئی ہے تو ایونٹ لوپ کال بیکس کو قطار میں شامل کرنے کی اجازت دیتا ہے جو اس کے ذریعہ انجام دی جائے گی۔

یہ ایک سادہ کوڈ مثال کے ساتھ بہترین طور پر بیان کیا گیا ہے:

مقررہ وقت ( ( ) => {

تسلی. لاگ ( 'Async آپریشن مکمل ہو گیا' ) ;

} , 2000 ) ;

تسلی. لاگ ( 'شروع کریں' ) ;

فوری طور پر مقرر کریں ( ( ) => {

تسلی. لاگ ( 'سیٹ فوری کال بیک عمل میں آیا' ) ;

} ) ;

تسلی. لاگ ( 'ختم' ) ;

اس کوڈ میں:

  • دو پیغامات 'شروع' اور 'اختتام' پروگرام کے آغاز اور ختم ہونے کی نشاندہی کرتے ہیں۔
  • setTimeout() فنکشن 2 ms کی تاخیر کے ساتھ کال بیک فنکشن سیٹ کرتا ہے اور ٹرمینل پر 'Async آپریشن مکمل' لاگ کرتا ہے۔
  • ٹرمینل پر اسٹارٹ میسج لاگ ان ہونے کے بعد setImmediate() فنکشن 'setImmediate callback executed' پیغام کو ٹرمینل پر لاگ کرتا ہے۔

آؤٹ پٹ

آؤٹ پٹ صرف ایک منٹ کے مشاہدے کے ساتھ پیغامات کو دکھائے گا کہ 'Async آپریشن مکمل' میں وقت لگتا ہے اور 'End' پیغام کے بعد پرنٹ کیا جاتا ہے:

Node.js چیک فیز

پولنگ کے مرحلے کے مکمل ہونے کے بعد چیک کے مرحلے میں کال بیکس کو عمل میں لایا جاتا ہے۔ اگر کوئی کوڈ اسکرپٹ setImmediate() فنکشن کا استعمال کرتے ہوئے شیڈول کیا گیا ہے اور پول فنکشن مفت ہے، تو ایونٹ لوپ بیکار رہنے کے بجائے براہ راست چیک فیز میں جا کر کام کرتا ہے۔ setImmediate() فنکشن ایک منفرد ٹائمر ہے جو ایونٹ لوپ کے مختلف مراحل کے دوران کام کرتا ہے۔

libuv API کا استعمال پول کے مرحلے پر عمل درآمد مکمل ہونے کے بعد کال بیک کے عمل کی منصوبہ بندی کے لیے کیا جاتا ہے۔ کوڈ پر عمل درآمد کے دوران، ایونٹ لوپ پول کے مرحلے میں داخل ہوتا ہے جس میں وہ آنے والی کنکشن کی درخواستوں کا انتظار کرتا ہے۔ ایک اور صورت میں اگر کال بیک سیٹImmediate() فنکشن کا استعمال کرتے ہوئے شیڈول کیا گیا ہے اور پول کا مرحلہ بغیر کسی سرگرمی کے ختم کر دیا گیا ہے تو یہ انتظار کرنے کے بجائے چیک کے مرحلے میں چلا جائے گا۔ سمجھنے کے لیے ذیل کی مثال پر غور کریں:

// application.js

تسلی. لاگ ( 'شروع کریں' ) ;

فوری طور پر مقرر کریں ( ( ) => {

تسلی. لاگ ( 'فوری کال بیک' ) ;

} ) ;

تسلی. لاگ ( 'ختم' ) ;

اس کوڈ میں تین پیغامات ٹرمینل پر لاگ ان ہوتے ہیں۔ setImmediate() فنکشن پھر آخر میں پیغام کو لاگ کرنے کے لیے کال بیک بھیجتا ہے۔ فوری کال بیک 'ٹرمینل کی طرف۔

آؤٹ پٹ

مندرجہ بالا کوڈ کا آؤٹ پٹ درج ذیل ترتیب میں ظاہر ہوگا:

Node.js کال بیکس بند کریں۔

Node.js اس قریبی مرحلے کا استعمال واقعات کو بند کرنے اور ایونٹ لوپ کے تکرار کو ختم کرنے کے لیے کال بیکس چلانے کے لیے کرتا ہے۔ کنکشن بند ہونے کے بعد، ایونٹ لوپ اس مرحلے میں اختتامی واقعات کو سنبھالتا ہے۔ ایونٹ لوپ کے اس مرحلے میں، 'nextTick()' اور مائیکرو ٹاسک تیار ہوتے ہیں اور اسی طرح دوسرے مراحل کی طرح پروسیس ہوتے ہیں۔

process.exit فنکشن کسی بھی لمحے ایونٹ لوپ کو ختم کرنے کے لیے استعمال کیا جاتا ہے۔ ایونٹ لوپ کسی بھی زیر التواء غیر مطابقت پذیر کارروائیوں کو نظر انداز کر دے گا اور Node.js عمل ختم ہو جائے گا۔

غور کرنے کے لئے ایک سادہ مثال یہ ہے:

// application.js
const نیٹ = ضرورت ہے ( 'جال' ) ;
const سرور = نیٹ تخلیق سرور ( ( ساکٹ ) => {
ساکٹ پر ( 'بند کریں' , ( ) => {
تسلی. لاگ ( 'ساکٹ بند' ) ;
} ) ;
ساکٹ پر ( 'ڈیٹا' , ( ڈیٹا ) => {
تسلی. لاگ ( 'موصول ڈیٹا:' ، ڈیٹا۔ toString ( ) ) ;
} ) ;
} ) ;
سرور پر ( 'بند کریں' , ( ) => {
تسلی. لاگ ( 'سرور بند' ) ;
} ) ;
const بندرگاہ = 3000 ;
سرور سنو ( بندرگاہ، ( ) => {
تسلی. لاگ ( `پورٹ پر سرور سن رہا ہے۔ { بندرگاہ } ` ) ;
} ) ;
مقررہ وقت ( ( ) => {
تسلی. لاگ ( '10 سیکنڈ کے بعد سرور بند ہو رہا ہے' ) ;
سرور بند کریں ( ) ;
عمل باہر نکلیں ( ) ;
} , 10000 ) ;

اس کوڈ میں:

  • ' const net = درکار ('نیٹ') 'TCP سرور کو ہینڈل کرنے کے لیے درکار نیٹ ماڈیول درآمد کرتا ہے اور' const سرور = net.createServer((ساکٹ) => { ایک نیا TCP سرور مثال بناتا ہے۔
  • ' socket.on('close', () => {… } تمام ساکٹ پر 'قریب' کو سنتا ہے۔ جب ساکٹ کنکشن بند ہو جاتا ہے تو پیغام 'ساکٹ بند' ٹرمینل پر لاگ ان ہوتا ہے۔
  • ' socket.on('ڈیٹا'، (ڈیٹا) => {} تمام انفرادی ساکٹ سے آنے والے ڈیٹا کو چیک کرتا ہے اور اسے '.toString()' فنکشن کا استعمال کرتے ہوئے پرنٹ کرتا ہے۔
  • ' server.on('close', () => {…} سرور پر ہی 'کلوز' ایونٹ کی جانچ پڑتال کرتا ہے، اور جب سرور کنکشن بند ہوجاتا ہے تو یہ ٹرمینل پر 'سرور بند' پیغام کو لاگ کرتا ہے۔
  • ' server.listen(port, () => {…} پورٹ پر آنے والے کنکشن کو سنتا ہے۔
  • ' setTimeout(() => {…} سرور کو بند کرنے کے لیے 10 ms کا ٹائمر سیٹ کرتا ہے۔

یہ Node.js میں ایونٹ لوپ کے مختلف مراحل پر بحث کو ختم کرتا ہے۔ کسی نتیجے پر پہنچنے سے پہلے آئیے ایک آخری چیز پر بات کرتے ہیں جو کہ Node.js میں ایونٹ لوپ سے باہر نکلنے کا طریقہ ہے۔

Node.js میں ایونٹ لوپ سے باہر نکلنا

ایونٹ لوپ عملدرآمد کے مرحلے میں ہے جب تک کہ ایونٹ لوپ مراحل کی تمام قطاروں میں کچھ کام موجود ہوں۔ ایگزٹ فیز کے اخراج کے بعد ایونٹ کا لوپ ختم ہو جاتا ہے اور اگر مزید ٹاسک قطار میں نہ ہوں تو ایگزٹ سننے والا کال بیک واپس آجاتا ہے۔

ایونٹ لوپ کو ختم کرنے کا واضح طریقہ '.exit' طریقہ استعمال کرنا ہے۔ Node.js کے فعال عمل جیسے ہی process.exit فنکشن کو بلایا جائے گا فوری طور پر ختم ہو جائے گا۔ تمام طے شدہ اور زیر التوا واقعات کو چھوڑ دیا جائے گا:

عمل پر ( 'باہر نکلیں' , ( کوڈ ) => {

تسلی. لاگ ( `ایگزٹ کوڈ کے ساتھ باہر نکلنا : $ { کوڈ } ` ) ;

} ) ;

عمل باہر نکلیں ( 1 ) ;

صارفین .exit فنکشن کو سن سکتے ہیں۔ واضح رہے کہ '.exit' فنکشن کو ہم وقت ساز ہونا چاہیے کیونکہ Node.js پروگرام اس ایونٹ کو سنتے ہی باہر نکل جائے گا۔

یہ ایونٹ لوپ پر بحث کو ختم کرتا ہے۔ ایک گہرائی والا مضمون جس میں ایونٹ لوپ سے متعلق تمام تصورات، مراحل اور مثالوں کا احاطہ کیا گیا ہے۔

نتیجہ

ایونٹ لوپ کو سمجھنے سے پہلے، ہم وقت ساز اور غیر مطابقت پذیر تصورات کا جائزہ ایونٹ لوپ میں کوڈ کے بہاؤ کو سمجھنے میں مدد کر سکتا ہے۔ ہم وقت ساز عملدرآمد کا مطلب ہے مرحلہ وار عمل درآمد جبکہ غیر مطابقت پذیر عمل کا مطلب ہے کچھ مراحل کو ان کے مکمل ہونے کا انتظار کیے بغیر روکنا۔ ایونٹ لوپ کے کام کے ساتھ ساتھ تمام مراحل کے ساتھ مناسب مثالوں کے ساتھ مضمون میں بحث کی گئی ہے۔