مبرمجو جافا سكريبت معتادون على تزييف التوازي ، ولكن هناك طريقة لتحقيق توازي حقيقي يجب أن تستخدمه الآن.

يمكن أن تكافح جافا سكريبت مع المهام كثيفة الأداء لأنها لغة ذات ترابط واحد. باستخدام التوازي ، يمكنك تحقيق تنفيذ متعدد مؤشرات الترابط في JavaScript وتحسين أداء واستجابة تطبيقات الويب الحديثة.

التوازي في برمجة جافا سكريبت

التوازي أمر حاسم في الحوسبة الحديثة لتحسين الأداء وقابلية التوسع. يقوم بذلك عن طريق الاستخدام الفعال للموارد المتاحة.

الأسلوب الشائع المستخدم لتحقيق التوازي في البرمجة هو خيوط المعالجة المتعددة. ومع ذلك ، فإن خيط JavaScript هو نظام ذو مؤشر ترابط واحد ويمكنه فقط التعامل مع مهمة واحدة في كل مرة. هذا يعني أنه ليس على دراية بعمليات تنفيذ البرامج المتوازية.

جافا سكريبت تزييف البرمجة المتوازية

من المفاهيم الخاطئة الشائعة حول التوازي أنه يمكنك تحقيق ذلك باستخدام تقنيات البرمجة غير المتزامنة مثل عدم التزامن / انتظار ، عمليات الاسترجاعات ، والوعود:

// Async / await دالة تحاكي طلب الشبكة
غير متزامنوظيفةابحث عن المعلومة() {
مقدار ثابت استجابة = انتظر أحضر()؛
مقدار ثابت البيانات = انتظر response.json () ؛
instagram viewer

يعود بيانات؛
}

// وظيفة رد الاتصال التي تسجل البيانات التي تم جلبها إلى وحدة التحكم
وظيفةتسجيل البيانات(بيانات) {
وحدة التحكم.تسجيل البيانات)؛
}

// Promise.all () هي الطريقة التي تنفذ وعودًا متعددة بالتوازي
يعد.الجميع([
ابحث عن المعلومة()،
ابحث عن المعلومة()،
]).ثم((نتائج) => {
وحدة التحكم.log (النتائج) ؛
});

// استدعاء دالة fetchData ومرر وظيفة logData كإعادة اتصال
fetchData (). ثم (logData) ؛

هذه التقنيات لا تنفذ في الواقع التعليمات البرمجية بالتوازي. تستخدم JavaScript حلقة الحدث لتقليد البرمجة المتوازية في تصميمها أحادي الخيط.

تعد حلقة الحدث جزءًا أساسيًا من بيئة وقت تشغيل JavaScript. يسمح لك بتنفيذ عمليات غير متزامنة ، مثل طلبات الشبكة ، في الخلفية دون حظر الخيط الفردي الرئيسي.

تتحقق حلقة الحدث باستمرار من الأحداث أو المهام الجديدة في قائمة الانتظار وتنفذها واحدة تلو الأخرى بالتتابع. تسمح هذه التقنية لجافا سكريبت بتحقيق التزامن والتوازي النظري.

التزامن مقابل. تماثل

غالبًا ما يُساء فهم التزامن والتوازي ويتم تبادلهما في عالم JavaScript.

يشير التزامن في JavaScript إلى القدرة على تنفيذ مهام متعددة من خلال تداخل تنفيذ المهام. حيث يمكن أن تبدأ مهمة واحدة قبل اكتمال أخرى ، ولكن لا يمكن أن تبدأ المهام ولا تنتهي في وقت واحد. يتيح ذلك لـ JavaScript معالجة العمليات بكفاءة ، مثل جلب البيانات من REST API أو قراءة الملفات ، دون حجب سلسلة التنفيذ الرئيسية.

من ناحية أخرى ، يشير التوازي إلى القدرة على تنفيذ مهام متعددة في وقت واحد عبر خيوط متعددة. يمكن لخيوط الخلفية هذه تنفيذ المهام بشكل مستقل وفي نفس الوقت. هذا يفتح فرصًا لتحقيق توازي حقيقي في تطبيقات JavaScript.

يمكن لتطبيقات JavaScript تحقيق التوازي الحقيقي من خلال استخدام Web Workers.

يقدم عمال الويب التوازي لجافا سكريبت

يعد Web Workers إحدى ميزات متصفحات الويب الحديثة التي تسمح بتشغيل تعليمات JavaScript البرمجية في سلاسل رسائل في الخلفية ، منفصلة عن سلسلة التنفيذ الرئيسية. بخلاف السلسلة الرئيسية ، التي تتعامل مع تفاعلات المستخدم وتحديثات واجهة المستخدم. سيكون Web Worker مكرسًا لأداء مهام حسابية مكثفة.

يوجد أدناه رسم تخطيطي لعملية Web Worker في JavaScript.

يمكن للخيط الرئيسي وعامل الويب التواصل باستخدام تمرير الرسائل. باستخدام postMessage طريقة إرسال الرسائل و على الرسالة معالج الحدث لتلقي الرسائل ، يمكنك تمرير التعليمات أو البيانات ذهابًا وإيابًا.

إنشاء عامل الويب

لإنشاء Web Worker ، تحتاج إلى إنشاء ملف JavaScript منفصل.

هنا مثال:

// main.js

// إنشاء عامل ويب جديد
مقدار ثابت عامل = جديد عامل("worker.js");

// أرسل رسالة إلى Web Worker
worker.postMessage ("مرحبا من الموضوع الرئيسي!");

// الاستماع إلى الرسائل من Web Worker
العامل. onmessage = وظيفة(حدث) {
وحدة التحكم.سجل("تم تلقي الرسالة من Web Worker:"، event.data) ؛
};

ينشئ المثال أعلاه عامل ويب جديدًا عن طريق تمرير المسار إلى البرنامج النصي للعامل (عامل. js) كحجة ل عامل البناء. يمكنك إرسال رسالة إلى Web Worker باستخدام امتداد postMessage الطريقة والاستماع إلى الرسائل من Web Worker باستخدام على الرسالة معالج الحدث.

يجب عليك بعد ذلك إنشاء البرنامج النصي العامل (عامل. js) ملف:

// worker.js

// استمع للرسائل من الموضوع الرئيسي
self.onmessage = وظيفة(حدث) {
وحدة التحكم.سجل("رسالة مستلمة من الموضوع الرئيسي:"، event.data) ؛

// أرسل رسالة إلى الموضوع الرئيسي
self.postMessage ("مرحبًا من worker.js!");
};

يستمع البرنامج النصي Web Worker للرسائل من السلسلة الرئيسية باستخدام ملف على الرسالة معالج الحدث. عند تلقي رسالة ، تقوم بتسجيل الخروج من الداخل event.data وإرسال رسالة جديدة إلى الموضوع الرئيسي مع postMessage طريقة.

الاستفادة من التوازي مع عمال الويب

حالة الاستخدام الأساسية لـ Web Workers هي تنفيذ مهام JavaScript مكثفة حسابيًا بالتوازي. بإلغاء تحميل هذه المهام إلى Web Workers ، يمكنك تحقيق تحسينات كبيرة في الأداء.

فيما يلي مثال على استخدام عامل الويب لإجراء عملية حسابية ثقيلة:

// main.js

مقدار ثابت عامل = جديد عامل("worker.js");

// إرسال البيانات إلى Web Worker لحسابها
worker.postMessage ([1, 2, 3, 4, 5]);

// استمع إلى النتيجة من Web Worker
العامل. onmessage = وظيفة(حدث) {
مقدار ثابت النتيجة = event.data ؛
وحدة التحكم.سجل(نتيجة الحساب:، نتيجة)؛
};

Worker.js:

// استمع للبيانات من الموضوع الرئيسي
self.onmessage = وظيفة (حدث) {
مقدار ثابت الأرقام = event.data ؛

مقدار ثابت النتيجة = PerformHeavyCalculation (أرقام) ؛

// أرسل النتيجة مرة أخرى إلى الموضوع الرئيسي
self.postMessage (نتيجة) ؛
};

وظيفةأداء الحساب الثقيل(بيانات) {
// إجراء عملية حسابية معقدة على مصفوفة الأرقام
يعود بيانات
.خريطة((رقم) =>رياضيات.pow (number، 3)) // مكعب كل رقم
.منقي((رقم) => رقم ٪ 20) // تصفية الأرقام الزوجية
.يقلل((المجموع ، العدد) => مجموع + رقم ، 0); // جمع كل الأرقام
}

في هذا المثال ، تقوم بتمرير صفيف من الأرقام من مؤشر الترابط الرئيسي إلى Web Worker. يقوم Web Worker بإجراء الحساب باستخدام مصفوفة البيانات المتوفرة ويرسل النتيجة مرة أخرى إلى مؤشر الترابط الرئيسي. ال أداء عملية حسابية ثقيلة () تقوم الوظيفة بتعيين كل رقم إلى مكعبه ، وتصفية الأرقام الزوجية ، ثم جمعها في النهاية.

القيود والاعتبارات

بينما يوفر Web Workers آلية لتحقيق التوازي في JavaScript ، فمن المهم مراعاة بعض القيود والاعتبارات:

  • لا توجد ذاكرة مشتركة: يعمل عمال الويب في سلاسل رسائل منفصلة ولا يشاركون الذاكرة مع الخيط الرئيسي. لذلك ، لا يمكنهم الوصول مباشرة إلى المتغيرات أو الكائنات من السلسلة الرئيسية دون تمرير الرسالة.
  • التسلسل وإلغاء التسلسل: عند تمرير البيانات بين الخيط الرئيسي و Web Workers ، تحتاج إلى إجراء تسلسل للبيانات وإلغاء تسلسلها لأن تمرير الرسالة هو اتصال قائم على النص. تتكبد هذه العملية تكلفة أداء وقد تؤثر على الأداء العام للتطبيق.
  • دعم المتصفح: على الرغم من دعم Web Workers بشكل جيد في معظم متصفحات الويب الحديثة ، إلا أن بعض المتصفحات القديمة أو البيئات المحدودة قد يكون لديها دعم جزئي أو لا يدعم Web Workers.

تحقيق التوازي الحقيقي في JavaScript

يعد التوازي في JavaScript مفهومًا مثيرًا يتيح تنفيذًا متزامنًا حقيقيًا للمهام ، حتى في لغة ذات سلسلة مفردة بشكل أساسي. من خلال تقديم Web Workers ، يمكنك الاستفادة من قوة التوازي وتحقيق تحسينات كبيرة في الأداء في تطبيقات JavaScript.