لقد كنت أتعلم واستخدام node.js لمدة شهرين. لقد استخدمت Express ودمجت مع mongoose لكتابة تطبيق ويب ومجموعة من واجهات برمجة تطبيقات الويب المريحة. إذا نظرنا إلى الوراء في مقدمة Node.js على الصفحة الرئيسية للموقع الرسمي لـ Node.js: يستخدم Node.js نموذج I/O غير المحظور الذي يجعله خفيف الوزن وفعال. إذن ماذا يعني نموذج I/O غير المحظور؟
نموذج IO غير المحظور
بادئ ذي بدء ، لا شك أن عمليات IO تستغرق وقتًا طويلاً. عندما يتلقى الخادم عددًا كبيرًا من الطلبات ، فإن إنشاء عملية أو مؤشر ترابط لكل طلب يضيف أيضًا نقل الذاكرة الإضافية ، وقد يضيع المزيد من الوقت والموارد.
نظرًا لأن Node.js مدفوعة بالحدث ، فإنه يستخدم حلقات الأحداث لحل مشاكل عنق الزجاجة الناجمة عن عمليات IO. في node.js ، عادة ما يكون لعملية IO وظيفة رد الاتصال. عند اكتمال عملية IO وإرجاعها ، سيتم استدعاء وظيفة رد الاتصال ، ويستمر مؤشر الترابط الرئيسي في تنفيذ الكود التالي. دعنا نوضح بإيجاز هذه المشكلة بمثال:
طلب ('http://www.google.com' ، الدالة (خطأ ، استجابة ، الجسم) {console.log (body) ؛}) ؛ console.log ('تم!') ؛يعني هذا الرمز إصدار طلب إلى "http://www.google.com" ، وعندما يقوم الطلب بإرجاع وظيفة رد الاتصال هذه ، يتم إخراج معلومات الاستجابة. نظرًا لآلية التشغيل لـ Node.js ، بعد تشغيل هذا الرمز ، سيتم إخراجه على الفور "تم القيام به!" على وحدة التحكم ، ثم إخراج معلومات الاستجابة بعد فترة من الزمن.
حلقة حدث الحدث
بعد ذلك ، دعونا نناقش آلية حلقة الحدث. أولاً ، دعنا نتحدث عن المكالمة ، على سبيل المثال ، هناك الرمز التالي:
الدالة A (Arg ، func) {var a = arg ؛ func () ؛ console.log ('a') ؛ } الوظيفة B () {console.log ('b') ؛} a (0 ، b) ؛بعد تنفيذ الكود ، يتم دفع الوظيفة A أولاً إلى المكالمة وتصبح العنصر العلوي من المكدس ويبدأ في تنفيذ A. أثناء عملية التنفيذ ، يتم دفع الوظيفة B إلى المكالمة وتصبح العنصر العلوي للمكدس. بعد تنفيذ B ، يتم ظهور B ودعاها ، وتصبح A العنصر العلوي من المكدس مرة أخرى. بعد تنفيذ A ، يتم عرض A واتصلت ، والمكالمة خاملة.
يوجد قائمة انتظار رسالة في وقت تشغيل JavaScript ، وترتبط الرسالة بوظيفة رد الاتصال. عندما يتم تشغيل حدث ما ، إذا كان للحدث وظيفة رد اتصال مقابلة ، فسيتم إضافة الرسالة إلى قائمة انتظار الرسائل.
دعنا نتحدث عن ماهية حلقة الحدث. بعد أن يبدأ الرمز في التنفيذ ، يتم دفع الوظيفة باستمرار إلى المكالمة. خذ المثال أعلاه. يتم دفع الطلب إلى المكالمة ، وستقوم هذه الوظيفة بتقديم طلب HTTP (سيتم تسليم طلب HTTP هذا إلى الوحدة النمطية الأساسية لـ Node.js) ويترافق الحدث في نفس الوقت بوظيفة رد الاتصال. يتم عرض الطلب واتصل به ، ويتم دفع console.log إلى المكالمة لبدء التنفيذ. عند اكتمال الطلب ، يتم تشغيل حدث الإكمال وإضافة رسالة إلى قائمة انتظار الرسائل. يقوم قائمة انتظار الرسائل أولاً بالتحقق مما إذا كانت المكالمة خاملة. إذا لم تكن المكالمة خاملة ، فسوف تنتظر حتى تكون المكالمة خاملة وتظهر رأس قائمة انتظار الرسائل. في هذا الوقت ، يتم تنفيذ وظيفة رد الاتصال المرتبطة بالرسالة.
ملخص
ما سبق هو ملخص مفاهيمي لنموذج عدم الحظر وحلقة الحدث. آلية حلقة الحدث هذه ليست فريدة من نوعها فقط لـ Node.js ، ويتم تنفيذ رمز Node.js بواسطة مؤشر ترابط واحد. ما هي المزايا عند مواجهة عدد كبير من الطلبات المتزامنة؟
تُظهر الصورة أعلاه مخطط العمارة لـ Node.js. هناك وحدة نمطية في الطبقة الأساسية من Node.js هي المسؤولة عن الحفاظ على تجمع الخيوط. عند إصدار طلب IO ، ستقوم الطبقة الأساسية لـ Node.js بإنشاء مؤشر ترابط جديد لمعالجة الطلب ، ثم إرجاع النتيجة إلى الطبقة العليا بعد الانتهاء. بعد ذلك ، عندما تكون هناك طلبات متعددة ، ستستخدم الوحدة النمطية الأساسية لـ Node.js أقل عدد ممكن من مؤشرات الترابط لإكمال معظم المهام. إذا كان هناك مؤشرات ترابط مجانية ، فسيستمر استخدامها للقيام بأشياء أخرى. هذا بلا شك أكثر ذكاءً وأكثر كفاءة لفتح عملية أو مؤشر ترابط جديد لكل طلب كما هو مذكور سابقًا.
هذا المقال هو ملخص للتعلم Node.js. إذا كانت هناك أي مشاكل أو أوجه قصور ، نرحب بالنقد والتصحيح.