سؤال

هل هناك أي تفسير جيد وقصير لكيفية ممثلين يعمل بالمقارنة مع المواضيع؟

لا يمكن اعتبار موضوع كممثل وإرسال رسائل إلى مؤشرات ترابط أخرى؟ أرى بعض الاختلاف ، لكن هذا ليس واضحًا بالنسبة لي. هل يمكنني استخدام ممثلين في أي لغة باستخدام المواضيع بشكل مختلف؟

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

المحلول

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

لا ينبغي لنا أن نتغلب على متحمس ، ولكن. نموذج الممثل لا (على عكس بعض الادعاءات) يجعل من المستحيل أن يكون لديك مسدود. لا يمنعك نموذج الممثل أيضًا من التنافس على الموارد بين العمليات المختلفة - قوائم قوائم الرسائل ، على سبيل المثال. النموذج هو فقط "خالي من القفل" أعلى مستوى معين. في المستوى الأدنى ، لتنسيق قوائم قوائم الرسائل ، لا يزال هناك حاجة إلى قفل.

لا يمكن اعتبار موضوع كممثل وإرسال رسائل إلى مؤشرات ترابط أخرى؟

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

هل يمكنني استخدام نموذج الممثل بأي لغة باستخدام مؤشرات الترابط بشكل مختلف؟

نعم ، لكن الأمر سيستغرق المزيد من العمل. قد تحتوي لغتك المفضلة على مكتبة لتصوير الرسائل ، بحيث يكون هذا هو أول شيء للتحقيق. أيضا ، يجب عليك التحقيق في استخدام هياكل البيانات غير القابلة للتغيير. لاحظ أنه إذا كان بنية البيانات غير قابلة للتغيير ، فعليك التعامل بشكل أساسي مع مشكلة "الحالة المشتركة"-يمكن لخيوط متعددة أن تعقد مراجع إلى البيانات غير القابلة للتغيير دون حدوث أي شيء سيء. هناك سبب يميل لغات الممثلين إلى أن تكون أيضًا لغات وظيفية (Erlang ، Scala).

قد ترغب أيضًا في إلقاء نظرة على ذاكرة المعاملات البرمجية ، وهو نموذج مختلف ولكنه مقنع أيضًا. Clojure هو المثال المفضل لدي على ذلك.

نصائح أخرى

لن أقول أن الجهات الفاعلة تمرر دائمًا رسائل غير متزامنة-ستكون بطيئة للغاية. مثال على ذلك ، يستخدم Jactor Project رسائل ثنائية الاتجاه (طلب/استجابة) لتحسين نموذج استدعاء الطريقة. ومعظم الطلبات يتم خدمتها بشكل متزامن.

Jactor (مكتبة Java) لا تستخدم الأقفال. فقط بعض هياكل البيانات الذرية والمتزامنة ، مع إلقاء بعض الرسائل. تمرير الرسائل حوالي 0.8 مليار رسالة في الثانية.

https://github.com/laforge49/jactor

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