يبدو أن الكثير من الأشخاص لا يفهمون كيف يمكن لـ NodeJS ذات الخيوط الواحدة التنافس مع الواجهات الخلفية متعددة الخيوط.
لمعرفة السبب، علينا أن نفهم ما يعنيه حقًا أن Nodejs عبارة عن خيط مفرد.
تم إنشاء JavaScript نفسها في الأصل للقيام بأشياء بسيطة مثل التحقق من صحة النماذج وتقديم الاستجابات وما إلى ذلك. ولم يكن الأمر كذلك حتى عام 2009 عندما جعل منشئ Node.js Ryan Dahl من الممكن كتابة تعليمات برمجية من جانب الخادم باستخدام JavaScript.
تحتوي اللغات من جانب الخادم التي تدعم تعدد العمليات على هياكل وبنيات مختلفة للمزامنة بين سلاسل الرسائل والميزات الأخرى الموجهة نحو سلاسل الرسائل.
إن دعم هذه الأشياء يعني أن JavaScript ستحتاج إلى تغيير اللغة بأكملها، وهو ما يتعارض مع أفكار منشئي JavaScript. لذلك، من أجل دعم مؤشرات الترابط المتعددة في JavaScript خالصة، كان على Dahl إنشاء حل بديل. دعونا نلقي نظرة!
كيف يعمل Node.js؟
يستخدم Node.js نوعين من سلاسل العمليات: الخيط الرئيسي، الذي تتم معالجته بواسطة حلقة الحدث، والعديد من الخيوط الثانوية في مجموعة من سلاسل العمليات العاملة.
تعمل آلية Event Loop Node.js للتعامل مع عمليات الإدخال/الإخراج غير المحظورة - على الرغم من أن JavaScript ذات خيط واحد - على إلغاء تحميل العمليات إلى نواة النظام عندما يكون ذلك ممكنًا. عندما تقوم عملية JavaScript بحظر سلسلة رسائل، يتم حظر حلقة الحدث أيضًا.
تجمع العمال هو نموذج تنفيذ يولد ويعالج سلاسل منفصلة، ثم ينفذ المهام بشكل متزامن ويعيد النتائج إلى حلقة الحدث. تستخدم حلقة الحدث بعد ذلك النتيجة المذكورة لتنفيذ رد الاتصال المقدم.
بشكل أساسي، يتعامل تجمع العمال مع عمليات الإدخال/الإخراج غير المتزامنة - بشكل أساسي التفاعلات مع قرص النظام والشبكة. تستخدم بعض الوحدات تجمعات عاملة خارج الصندوق، مثل fs (I/O-heavy) أو التشفير (CPU-heavy). يتم تنفيذ تجمع العمال في libuv، مما يسبب تأخيرًا طفيفًا ولكن لا يكاد يذكر عندما تحتاج Node إلى نقل البيانات داخليًا بين JavaScript وC++.
بعد فهم معنى حلقة الحدث وتجمع العمل، دعونا نلقي نظرة على الكود التالي:
في الكود أعلاه، لا يتعين علينا انتظار الحدث بشكل متزامن. نقوم بتفويض مهمة قراءة الملف إلى تجمع العمال واستدعاء الوظيفة المقدمة بالنتيجة. نظرًا لأن تجمع العمال يحتوي على مؤشر ترابط خاص به، فيمكن أن تستمر حلقة الحدث في التنفيذ بشكل طبيعي أثناء قراءة الملف.
اسمحوا لي أن أقدم لكم:worker_threads
مع إصدار Node.js 10.5.0، ظهرتworker_threads. وهو يدعم إنشاء تطبيقات بسيطة متعددة الخيوط في JavaScript،
وworker_threads عبارة عن حزمة وحدة Nodejs. عامل مؤشر الترابط هو جزء من التعليمات البرمجية (عادةً ما يتم أخذه من ملف) يتم إنشاؤه في مؤشر ترابط منفصل.
من المهم ملاحظة أن المصطلحات "عامل الخيط" و"العامل" و"الخيط" غالبًا ما تستخدم بالتبادل. كلهم يشيرون إلى نفس الشيء.
تعتبر سلاسل العمل في Node.js مفيدة لأداء مهام JavaScript الثقيلة. بمساعدة الخيوط، يمكن للعمال بسهولة تشغيل تعليمات JavaScript البرمجية بالتوازي، مما يجعلها أسرع وأكثر كفاءة. يمكننا إكمال المهام الثقيلة دون إزعاج الموضوع الرئيسي.
لم يتم تقديم سلاسل العمليات في الإصدارات الأقدم من Node.js. لذا قم أولاً بتحديث Node.js الخاص بك للبدء.
الآن قم بإنشاء ملفين لتنفيذ المواضيع كما يلي:
اسم الملف: عامل.js
const {workerData,parentPort } = require('worker_threads'); console.log("اكتب كيف يريد ${workerData} الاسترخاء مع الكبار`); parentPort.postMessage({ اسم الملف: عامل البيانات، الحالة: "تم" });
اسم الملف: مؤشر.js
const { Worker } = require('worker_threads'); const runSerice = (workerData) => { إرجاع وعد جديد ((حل، رفض) => { const عامل = عامل جديد('./worker.js', {workerData }); عامل.on('رسالة', حل); عامل.ون('خطأ', رفض); عامل.ون('خروج', (كود) => { إذا (الكود !== 0) رفض(new Error(`توقف مؤشر ترابط العامل مع رمز الخروج ${code}`)); }); }); }; تشغيل ثابت = غير متزامن () => { نتيجة ثابتة = انتظار runSerice('Tunde Ednut'); console.log(result); }; run().catch((err) => console.error(err))
;