إرلانج gen_server مقابل وحدة عديمي الجنسية

StackOverflow https://stackoverflow.com/questions/1613958

  •  06-07-2019
  •  | 
  •  

سؤال

ولقد انتهيت مؤخرا كتاب جو وأنها تتمتع تماما. أنا منذ ذلك الحين بدأت الترميز تطبيق الحقيقي لينة مع إرلانج ويجب أن أقول أنا قليلا الخلط في استخدام gen_server.

ومتى يجب استخدام gen_server بدلا من وحدة نمطية عديمي الجنسية بسيطة؟ يمكنني تحديد وحدة عديمي الجنسية على النحو التالي: - وحدة نمطية التي يلزم على الدولة كمعلمة (مثل الكثير من ETS / DETS) بدلا من ابقائها داخليا (مثل gen_server)

ويقول على وحدة نوع مدير الفاتورة، ينبغي أن تهيئة وإعادة الدولة التي كنت ثم تمرير لاحقا لذلك؟ SomeState = InvoiceManager: التهيئة () SomeState = InvoiceManager: AddInvoice (SomeState، AnInvoiceFoo)

لنفترض أنني كنت بحاجة مثيلات متعددة من الدولة مدير فاتورة (ويقول طلبي يدير عدة شركات مع كل الفواتير الخاصة بهم)، وينبغي أن يكون لكل gen_server مع الحالة الداخلية لإدارة الفواتير، أو يفعل ذلك أفضل من المناسب أن يكون ببساطة وحدة عديمي الجنسية أعلاه؟

وأين هو الخط الفاصل بين الاثنين؟

و(لاحظ فاتورة إدارة المثال أعلاه هو أن فقط، مثال لتوضيح سؤالي)

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

المحلول

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

نصائح أخرى

وأنا لا أعتقد حقا أن تتمكن من إجراء هذا التمييز بين ما تسمونه وحدة عديمي الجنسية وgen_server. وفي كلتا الحالتين هناك العودية تتلقى حلقة الذي يحمل الدولة في حجة واحدة على الأقل. هذه الحلقة الرئيسية يعالج طلبات ويفعل عمل اعتمادا على الطلبات و، عند الضرورة، ويحفز إرسال النتائج مرة أخرى لطالبي. والحلقة الرئيسية على الأرجح التعامل مع عدد من الطلبات الإدارية والتي قد لا تكون جزءا من API الرئيسي / البروتوكول.

والفرق هو أن gen_server خلاصات بعيدا تلقي الرئيسي حلقة ويسمح للمستخدم فقط الكتابة الفعلية <م> رمز المستخدم . فإنه سيتم أيضا التعامل مع العديد من المهام الإدارية OTP بالنسبة لك. والفرق الرئيسي هو أن <م> رمز المستخدم هو في وحدة أخرى مما يعني أنك عرض كما مرت الدولة أكثر سهولة. إلا إذا كنت تدير فعلا لكتابة التعليمات البرمجية في واحد كبير يتلقى حلقة وليس استدعاء وظائف أخرى للقيام بهذا العمل لا يوجد فرق حقيقي.

والأسلوب الذي هو أفضل يعتمد إلى حد كبير على ما تحتاجه. باستخدام gen_server وتبسيط التعليمات البرمجية الخاصة بك وتعطيك إضافة وظائف "مجانا" ولكن يمكن أن يكون أكثر تقييدا. سوف المتداول بنفسك تعطيك المزيد من القوة ولكن أيضا على إعطاء المزيد من الإمكانيات لscreww الامور. وربما هو أسرع قليلا أيضا. ماذا تحتاج؟

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

إذا قمت بمشاركة الدولة على عمليات متعددة ربما يجب عليك الذهاب مع gen_server وإذا كانت الدولة هي مجرد المحلية لعملية واحدة وحدة عديمي الجنسية ستفعل ما يرام.

وأفترض الفواتير الخاصة بك (أو ما تمثله) يجب أن تكون مستمرة، حتى يتمكنوا في نهاية المطاف في ETS / الجدول Mnesia على أي حال. إذا كان الأمر كذلك، يجب عليك إنشاء وحدة نمطية عديمي الجنسية حيث يمكنك وضع API الخاصة بك للوصول إلى طاولة الفاتورة.

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