سكالا الفاعلة باعتبارها واحدة مترابطة طوابير
-
05-07-2019 - |
سؤال
أود أن استخدام الجهات الفاعلة في البرنامج حيث سوف يكون نوعا من تقييد حول علاج بعض الجهات كما لو كانوا على قوائم الانتظار.على سبيل المثال, لنفترض أن لدي بعض خارجي النظام الذي أحداث التغيير يتم تطبيقها أيضا بعض ذاكرة التخزين المؤقت الخارجية بيانات النظام.لذلك لدي 2 الفاعلة:
ChangeApplicationActor
CacheActor
كجزء من ChangeApplicationActor
, عندما أتقدم بطلب تغيير بعض الكيان X
في نظام خارجي, أريد أن أرسل بعض الأحداث لنقول CacheActor
المزامنة:
val changeApplicationActor = actor {
loop {
react {
case ChangeInstruction(x) =>
externalSystem.applyChange(x)
cacheActor ! Sync(x)
}
}
}
ولكن لدي الآن شرطين:
- على
CacheActor
وقد الحالة الداخلية و من الناحية المثالية أود أن عملية لهاSync
تعليمات بالتتابع - إذا كنت في نهاية المطاف مع
CacheActor
's علبة تحتوي على اثنينSync(x)
تعليمات نفس قيمةx
, ثم أود أن تجاهل ثانية واحدة (أييجب أن يكون واحد فقط في انتظارSync
تعليمات أي قيمةx
)
هل هناك أي طريقة من إجبار فاعل أن يكون واحد الخيوط ؟ هل هناك أي طريقة يمكنني الوصول إلى الفاعل علبة وإزالة أي تكرار الأحداث ؟ هل يمكنني تجنب تنفيذ CacheActor
كما أم ، لا فاعل?
المحلول
فاعل يضمن تنفيذ فقط على موضوع واحد في وقت واحد ، و الرسائل في الفاعل علبة البريد في أجل FIFO, لذلك #1 هناك.
2 هو اصعب حيث لا يوجد دعم مدمج لذلك.هناك سمة على الفاعل يسمى "علبة البريد." يمكنك الوصول إلى علبة البريد مباشرة بدلا من خلال تلقي أو رد فعل.كل ما عليك القيام به هو سحب استدعاء مطابقة مزامنة الرسائل من علبة البريد قبل أن تتم معالجة الرسالة.عند القيام بذلك, يجب أن تزامن على الفاعل من أجل الحفاظ على ترابط آخر من محاولة إضافة الأشياء إلى علبة البريد من خلال رسالة ترسل.
وتجدر الإشارة إلى أن تزامن على الفاعل يزيل الجمود الحرية الضمانات المقدمة من قبل المكتبة ، سوف يقلل من قابلية.ولكن من وجهة النظر العملية ربما سوف تكون على ما يرام.