سؤال

تحيات،

لقد كنت أدرس JavaScript ، Nodejs. وأنا لا أفهم كيف يتم تجنب مشكلات التزامن في JavaScript.

لنقول إنني أعمل على كائن

var bigObject = new BigObject();

ولدي setTimer(function(){ workOnBigOjbect...} ) هذا سيعمل أيضًا bigOjbect.

إذا كان لدي قرص io مكتوبة في bigObject, وكائن مؤقت يعمل على bigObject, ، وقراءة الكود بانتظام من bigObject, ، كيف يتم تجنب مشكلات التزامن؟

بلغة منتظمة ، أود استخدام نمط قائمة انتظار/الأوامر الآمن من مؤشرات الترابط. كما أنني لا أرى الكثير من النقاش حول ظروف السباق لجافا سكريبت.

هل فاتني شيء؟

هل كانت مفيدة؟

المحلول

الهدف الكامل من Node.js هو أنه يحركه الحدث. يتم تشغيل جميع الكود في معالجات الأحداث في موضوع واحد. لا توجد مشكلات تزامن لأن الرمز لا يعمل بشكل متزامن. الجانب السلبي هو أن كل معالج الحدث يجب أن يخرج بسرعة لأنه يمنع الأحداث الأخرى.

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

نصائح أخرى

JavaScript هو واحد. في حالة وصول الوقت عند من المفترض أن يتم تنفيذ وظيفتك (استنادًا إلى كيفية استدعاء SetTimer) ، ولا يزال رمز الأصل قيد التشغيل ، فلن يتم تنفيذ الوظيفة حتى يتم إكمال رمز الأصل.

لا يوجد سوى موضوع واحد ؛ نرى: node.js على آلات متعددة النواة

أود أن أتوقع أن هذا يرجع إلى أن مؤشرات الترابط المتعددة غير مدعومة في محرك V8 JavaScript الأساسي لأن JavaScript عادةً ما يتم تنفيذها داخل المتصفح (حيث يوجد فقط في حالة واجهة المستخدم واحدة) ولا يدعم مؤشرات ترابط متعددة.

هناك هذا الشيء في JavaScript يسمى تشغيل إلى الانتهاء مما يضمن أنه في حالة تنفيذ رمز ، فإنه يتم تنفيذه تمامًا قبل تشغيل أي رمز آخر (غير متزامن) ، وبالتالي ، لا توجد مشكلات توافق.

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

نرى لماذا لا توجد أداة للتحكم في التزامن في جافا سكريبت لمزيد من التفاصيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top