سؤال

مفهوم أ com.coroutine يبدو الأمر مثيرًا للاهتمام، لكنني لا أعرف، إذا كان ذلك منطقيًا في بيئة إنتاجية حقيقية؟ما هي حالات استخدام الكوروتينات التي يمكن حلها بشكل أكثر أناقة أو بساطة أو أكثر كفاءة كما هو الحال مع الطرق الأخرى؟

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

المحلول

تتطلب coroutines الحقيقية دعمًا من أدواتك - يجب تنفيذها بواسطة المترجم ودعمها بواسطة إطار العمل الأساسي.

تم العثور على أحد الأمثلة الواقعية لـ Coroutines باستخدام الكلمة الأساسية "yield return" المتوفرة في C# 2.0، والتي تسمح لك بكتابة طريقة تُرجع قيمًا متعددة للتكرار.

ومع ذلك، فإن "عائد العائد" له قيود - يستخدم التنفيذ فئة مساعدة لالتقاط الحالة، وهو يدعم فقط حالة معينة من coroutine كمولد (مكرر).

في الحالة الأكثر عمومية، تتمثل ميزة Coroutines في أنها تجعل بعض الحسابات القائمة على الحالة أسهل بكثير في التعبير عنها وأسهل في الفهم - يمكن أن يكون تنفيذ آلة الحالة كمجموعة من الكورتينات أكثر أناقة من الأساليب الأكثر شيوعًا.لكن القيام بذلك يتطلب دعمًا وأدوات غير موجودة بعد في C# أو Java.

نصائح أخرى

وبعض الإجابات جيدة واصفا ما هي coroutines.

ولكن بالنسبة لحالة الاستخدام الفعلي. خذ خادم ويب. لديها الاتصالات المتزامنة متعددة، وأنها تريد جدولة القراءة والكتابة كل منهم.

ويمكن تنفيذها باستخدام هذه coroutines. كل اتصال هو coroutine الذي يقرأ / يكتب كمية صغيرة من البيانات، ثم "غلة" السيطرة على جدولة، الذي يمر إلى coroutine المقبل (الذي يفعل الشيء نفسه) ونحن دورة من خلال جميع الاتصالات المتوفرة.

والكثير منهم، على سبيل المثال:

grep TODO *.c *.h | wc -l

وخط الانابيب أعلاه هو بالضبط coroutine: الأمر grep يولد سلسلة من الخطوط التي تذهب إلى منطقة عازلة، الأمر wc "يأكل منها حتى". إذا كان المخزن المؤقت يملأ، وgrep "لبنات" حتى يفرغ العازلة، وإذا كان المخزن المؤقت فارغ، ينتظر قيادة wc لإدخال جديد.

والشيء عن coroutines هي أنها غالبا ما تستخدم الآن إما في أنماط أكثر تقييدا، مثل مولدات بيثون المذكورة، أو خطوط الأنابيب.

إذا كنت تريد أن تبدو أكثر عليهم، راجع المقالات ويكيبيديا، وخاصة على coroutines و المكررات .

وأعرف أن هذا هو ما يقرب من 5 سنوات منذ طرح السؤال، لكنني فوجئت لا أحد رأيهم في حالة استخدام الألعاب التي تستخدم فيها coroutines الكثير لآخر أساسا شريحة على حساب.

لتحافظ على معدل الإطار ثابت في اللعبة، دعنا نقول 60 إطارا في الثانية، لديك حول 16.6ms لتنفيذ التعليمات البرمجية في كل إطار. يتضمن محاكاة الفيزياء، ومعالجة المدخلات والرسم / اللوحة.

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

وماذا coroutines تتيح لك القيام به هو بطريقة أو بأخرى شريحة الوقت هذا الحساب بحيث يتم تشغيله قليلا في كل إطار.

لذلك أن يحدث، coroutines يسمح أساسا طريقة ل"العائد" حساب إلى "المتصل" (في هذه الحالة لعبة حلقة) بحيث المرة القادمة يسمى طريقة الاستئناف من حيث توقفت.

وCoroutines هي مفيدة لتنفيذ أنماط منتج / المستهلك.

وعلى سبيل المثال، قدم بيثون coroutines في ميزة لغة تسمى ، التي كان يهدف إلى تبسيط تنفيذ المكررات.

ويمكن أن يكون مفيدا أيضا لتنفيذ المهام المتعددة التعاونية، حيث كل مهمة هي coroutine أن ينتج لجدولة / المفاعل.

يمكن Coroutines يكون من المفيد أي وقت النظام لديه اثنين أو أكثر من قطعة من التعليمات البرمجية التي ستكون على شكل سلسلة متتابعة من الخطوات التي تنطوي على الكثير من الانتظار. تمثيل أكثر طبيعية

وعلى سبيل المثال، والنظر في الجهاز الذي يحتوي على واجهة المستخدم LCD و-لوحة المفاتيح والمودم، وأنه يحتاج إلى استخدام مودم للاتصال بشكل دوري وتقديم تقارير مستقلة وضعه ما قبل المستخدم في لوحة المفاتيح يقوم به. اجمل طريقة لكتابة واجهة المستخدم قد يكون استخدام وظائف مثل "input_numeric_value (& CONV_SPEED_FORMAT، وconveyor_speed)؛" الذي سيعود عندما يكون المستخدم قد دخل على القيمة، وأجمل طريقة للتعامل مع الاتصالات قد تكون وظائف استخدام مثل "wait_for_carrier ()؛" الذي سيعود عندما يكون على وحدة إما اتصال أو تقرر لن.

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

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

وكمثال أكثر تحديدًا في خط المنتج/المستهلك، يمكن لشيء بسيط مثل برنامج إعداد التقارير المجمعة المتواضع أن يستخدم إجراءات روتينية مشتركة.

التلميح الرئيسي لهذا المثال هو وجود عمل غير بديهي لاستهلاك بيانات الإدخال (على سبيل المثال.تحليل البيانات أو تراكم الرسوم والمدفوعات على الحساب)، والعمل غير التافه لإنتاج المخرجات.عندما تمتلك هذه الصفات:

  • من السهل تنظيم/فهم كود جانب الإدخال إذا كان بإمكانك "إصدار" وحدات العمل في أماكن مختلفة.
  • من السهل أيضًا تنظيم/فهم كود جانب الإخراج إذا كان بإمكانه "الاستيلاء" على وحدة العمل التالية في بنية تحكم متداخلة.

ثم تعد كل من coroutines وطوابير الانتظار من الأساليب الرائعة التي يجب أن تكون تحت تصرفك.

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