سؤال

لقد لاحظت طريقتان "رسالة تمر". واحد رأيته erlang استخدام والآخر هو من الثعبان بلا حدود. من ما أفهمه هنا هو الفرق

نمط Erlang - يتم إرسال الرسائل في قائمة الانتظار في صندوق البريد لعملية الاستقبال. من هناك تتم إزالتها في أساس FIFO. بمجرد أن ترسل العملية الأولى الرسالة، فهي مجانية للمتابعة.

Python Style - معالجة قوائم انتظار لإرسالها إلى العملية B. B تقوم حاليا بتنفيذ بعض الإجراءات الأخرى، لذلك يتم تجميد A حتى B جاهز للاستقبال. بمجرد فتح قناة القراءة، يرسل البيانات، ثم يستمر كلاهما.

الآن أرى إيجابيات طريقة Erlang التي لا تملكها أي عمليات محظورة. إذا لم يتمكن B أبدا من تلقي، لا يزال بإمكانه الاستمرار. ومع ذلك، لقد لاحظت في بعض البرامج التي كتبتها، أنه من الممكن أن تحصل صناديق رسائل Erlang للحصول على مئات (أو آلاف) من الرسائل لأن تدفق الرسائل أكبر من التدفق الخارجي.

الآن أنا لم أكتب برنامجا كبيرا في أي إطار / لغة لذلك أنا أتساءل تجاربك مع هذا، وإذا كان الأمر شيئا ما يجب أن أشعر بالقلق.

نعم، أعرف أن هذا مجردة، لكنني أبحث أيضا عن إجابات مجردة إلى حد ما.

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

المحلول

تجربتي في برمجة Erlang هي أنه عندما تتوقع معدل مراسلة عالية (أي منتج أسرع من المستهلك) ثم تضيف عنصر تحكم التدفق الخاص بك. سيناريو بسيط

  • سوف المستهلك: إرسال رسالة، انتظر ACK، ثم كرر.
  • سوف المنتج: انتظر رسالة، أرسل ACK عندما يتم تلقي الرسالة ومعالجتها، ثم كرر.

يمكن للمرء أن ينكسه أيضا، فإن المنتج ينتظر المستهلك من المجيء والاستيلاء على الرسائل التالية المتاحة.

يمكن إخفاء هذه الأساليب وغيرها من التحكم في التدفق خلف الوظائف، أول واحد متاح بالفعل في gen_server:call/2,3 ضد أ gen_server عملية سلوك OTP.

أرى المراسلة غير المتزامنة كما هو الحال في Erlang كناهي أفضل، نظرا لأن الوقت قد تكون مرتفعة، فقد ترغب كثيرا في تجنب المزامنة عند المراسلة بين أجهزة الكمبيوتر. يمكن للمرء بعد ذلك إنشاء طرق ذكية لتنفيذ التحكم في التدفق. قل، التي تتطلب من ACK من المستهلك لكل رسائل N، أرسلها المنتج، أو إرسال "Ping Me عندما تلقيت هذه" رسالة "الآن، ثم، لحساب وقت Ping.

نصائح أخرى

على نطاق واسع، هذا هو قوائم الانتظار غير المحدودة مقابل قوائم الانتظار المحددة. يمكن اعتبار قناة تكثيف حالة خاصة من قائمة الانتظار مع حجم 0.

قوائم الانتظار المحوس لها ميل إلى الجمود. مواضيع / عملية تحاول إرسال رسالة إلى بعضها البعض، سواء مع قائمة انتظار كاملة.

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

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

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