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

ما هو التوازي في جافا سكريبت؟
القراء مثلك يساعدون في دعم MUO. عند إجراء عملية شراء باستخدام الروابط الموجودة على موقعنا ، فقد نربح عمولة تابعة. اقرأ أكثر.

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





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

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





اجعل فيديو اليوم قم بالتمرير للمتابعة مع المحتوى

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





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

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

 // Async/await function that simulates a network request 
async function fetchData() {
  const response = await fetch();
  const data = await response.json();
  return data;
}

// Callback function that logs the fetched data to the console
function logData(data) {
  console.log(data);
}

// Promise.all() method that executes multiple promises in parallel
Promise.all([
  fetchData(),
  fetchData(),
]).then((results) => {
  console.log(results);
});

// Call the fetchData function and pass the logData function as a callback
fetchData().then(logData);

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



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

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





التزامن مقابل التوازي

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

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





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

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

هل يمكنني تنزيل برنامج Microsoft Word مجانًا

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

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

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

  مخطط سهم لتدفق عملية Web Worker

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

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

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

هنا مثال:

 // main.js 

// Create a new Web Worker
const worker = new Worker('worker.js');

// Send a message to the Web Worker
worker.postMessage('Hello from the main thread!');

// Listen for messages from the Web Worker
worker.onmessage = function(event) {
  console.log('Received message from Web Worker:', event.data);
};

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

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

 // worker.js 

// Listen for messages from the main thread
self.onmessage = function(event) {
  console.log('Received message from main thread:', event.data);

  // Send a message back to the main thread
  self.postMessage("Hello from worker.js!");
};

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

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

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

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

 // main.js 

const worker = new Worker('worker.js');

// Send data to the Web Worker for calculation
worker.postMessage([1, 2, 3, 4, 5]);

// Listen for the result from the Web Worker
worker.onmessage = function(event) {
  const result = event.data;
  console.log('Calculation result:', result);
};

Worker.js:

 // Listen for data from the main thread 
self.onmessage = function (event) {
  const numbers = event.data;

  const result = performHeavyCalculation(numbers);

  // Send the result back to the main thread
  self.postMessage(result);
};

function performHeavyCalculation(data) {
  // Perform a complex calculation on the array of numbers
  return data
    .map((number) => Math.pow(number, 3)) // Cube each number
    .filter((number) => number % 2 === 0) // Filter even numbers
    .reduce((sum, number) => sum + number, 0); // Sum all numbers
}

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

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

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

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

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

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