نظرة خاصة على الـ Coroutines في لغة الكوتلن

Mohammad Laifمنذ 4 سنوات

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

 

في هذا الدرس سنتعرف أكثر على مفهوم الـ Coroutines وخاصة في لغة الكوتلن. ففي الدرس السابق تعرفنا على الكروتين بشكل عام وقمنا بمقارنته مع الدوال. إما هنا فسنرى مدى تشابهه من الخيط الحاسوبي.

 

ماذا ستقرئ في هذا الدرس

  • الروتين التعاوني في لغة الكوتلن.
  • أبرز مواصفات الكروتين Coroutine.
  • تحقيق مبدأ الكروتين Coroutine في لغة الكوتلن.
  • أين توجد الكروتينات.
  • مايميز الكروتين Coroutine عن الخيط الحاسوبي Thread.
  • مايميز الكروتين Coroutine عن الدوال Function.
  • شكل يبين الدوال والكروتينات على الخيط الحاسوبي.

 

الروتين التعاوني في لغة الكوتلن

نستطيع فهم الروتين التعاوني Coroutine في لغة الكوتلن على أنه كائن قابل للتأجيل (أي الايقاف والتشغيل بشكل متكرر) ومتعاون مع بعضه البعض وفي طياته يحمل شفرة برمجية ليرسلها الى المعالج ليتم تنفيذها. نستطيع تخيل هذا الكائن على أنه خيط رقيق وخفيف يتواجد بداخل الخيط الحاسوبي الغليظ. ومن شدة خفته تستطيع إنشاء منه الآلاف! ويستطيع الانتقال والتبديل إلى خيوط اخرى. فمثلاً إذا أنشأت Coroutine في الخيط الحاسوبي الرئيسي Main Thread تستطيع توقيفه مؤقتاً إي تأجيله Suspended ومن ثم نقله الى خيط حاسوبي آخر واستئنافه Resume ليتم عمله, وهذا يعني أنه غير مرتبط بخيط حاسوبي.

 

أبرز مواصفات الكروتين Coroutine

اذن نستطيع تلخيص ابرز مواصفات الكورتين على انه:

  • كائن قابل للتأجيل (الإيقاف والاستئناف).
  • يشابه الخيط الحاسوبي في مفهومه, فهو ينقل ينفذ الشفرات التي بداخله الى المعالج.
  • نستطيع نقله من خيط حاسوبي الى آخر.
  • يستطيع التعاون مع امثاله.

 

تحقيق مبدأ الكروتين Coroutine في لغة الكوتلن

قامت لغة الكوتلن بإستخدام الخيوط الحاسوبية من لغة الجافا لإنشاء هذا المبدأ (نستطيع استخدام الـ Generators لبناء هذا المبدأ كذلك). حيث تم بناء الـ Coroutines في لغة الكوتلن فوق الـ Threads للغة الجافا على شاكلة مكتبة اولية 1st party (اختصار الى First-Party Library ويعني هذا أنه تم بناؤها من قبل صناع لغة الكوتلن أنفسهم, وليس من طرف مستخدم اللغة الا وهو المبرمج 2nd party, او من طرف آخر خارجي كشركة برمجيات مختلفة 3rd party) لذلك ستحتاج الى اضافة الاعتماديات في مشروعك عندما تريد استخدامها.

كذلك قامت الكوتلن بإستخدام الكثير من الامور التي تخص تزامن الجافا مثل الخيوط الحاسوبية Threads, الكائنات المستقبلية Future, المنادى Callable, نمط بركة الخيوط Thread Pools, وأشياء عديدة. تستطيع التعرف على كل هذه الأشياء في دورة التزامن بلغة الجافا تحت قسم أنماط التصميم للخيوط الحاسوبية.سنرى كل هذه الاشياء بشكل مفصل في الدروس القادمة.

 

أين توجد الكروتينات؟

عندما تقوم بتشغيل التطبيق في جهاز الأندرويد فأن النظام يصنع له عملية خاصة به. وبداخل هذه العملية ينشئ التطبيق خيط حاسوبي رئيسي لنفسه يسمى بالـ Main Thread او الـ UI Thread. ويأتي دور المبرمج في إنشاء خيوط اخرى. يتواجد الكروتين في داخل هذه الخيوط سواء كان الخيط الرئيسي او الخيوط الاخرى. لمعرفة المزيد حول إنشاء نظام الاندرويد العمليات والخيوط لتطبيقك تستطيع رؤية ذلك بالتفصيل في: طبقة الـ Android Runtime و العمليات Processes في الاندرويد.

 

مايميز الكروتين Coroutine عن الخيط الحاسوبي Thread

بعض النقاط التي يتميز فيها الكروتين عن الخيط الحاسوبي, وتعتبر كالفروقات الكبيرة بين الاثنين:

  • يمتاز الكروتين بإنه تعاوني مع بعضه البعض, بعكس الخيط الحاسوبي.
  • لا يحتاج لإدارة من النظام, بعكس الخيط الحاسوبي.
  • شبه ينعدم القلق من حصول حالات الحجب Blocks للخيوط.
  • لاداعي لإستخدام الاقفال Locks والعناصر Mutex وماشبه ذلك لتخطي مشاكل كنا نواجهها مع الخيوط.

 

مايميز الكروتين Coroutine عن الدوال Function

والان لو اردنا مراجعة مقارنة الكروتين Coroutine مع الدوال Function على الخيط الحاسوبي وطريقة تنفيذهم سيكون الوضع كالتالي:

صورة تبين الدوال على الخيط الحاسوبي

لاحظ الدوال لا تستطيع تأجيل نفسها مما ينشئ حالة حجب لباقي الدوال في الخيط الحاسوبي التي يعملون عليه. فالدالة A اذا تم تنفيذها فإنها تحجب الخيط عن الدالة B والعكس كذلك. مما قد ينتج عنه حالات تعليق للبرنامج اذا تعطلت احدى الدوال وقامت بالحجب للخيط.

 

 صورة بين الكروتينات الـ Coroutines على الخيط الحاسوبي

في الناحية الاخرى, لاحظ الـ Coroutines يستطيع تأجيل نفسه للسماح بغيرة بإكمال المهمة على الخيط الحاسوبي, ومن ثم يكمل من حيث بدأ. فإذا تعطل كروتين عن العمل (اقصد هنا الحالة التي تستغرق وقت كثير في أداء المهمة مما يؤدي الى تهنيق) فأنه لايقوم بالحجب, بل بإيقاف نفسه مؤقتاً.

 

من المراحل التي يمر عليها الكروتين هي مرحلة بداية التنفيذ إي Start, ولاتحدث إلا مرة واحدة. ثم مرحلة الـ Suspended وهي مرحلة التأجيل او التوقيف المؤقت, وبعدها مرحلة الـ Resumed وهي مرحلة الاستئناف وتحدثان بشكل مكرر حسب متطلبات وضع المهمه.

 

وهكذا نستطيع القول بإن

  • الدالة لاتستطيع التوقف الا عند انتهاء تنفيذها.
  • الدالة لاتستطيع ارجاع قيمة الا عند انتهاء تنفيذها (العبارة return).
  • الكروتين يستطيع التوقف عند اي سطر برمجي يريد, ويستطيع الاستئناف منه.
  • الكروتين يستطيع إرجاع قيمة عند اي سطر برمجي يريد (مشابه للعبارة yield).

 

ضع في بالك:

 إننا عندما نستخدم الارجاع return فانه ينهي الدالة ويمسح كل شئ في داخلها. أما إذا قمنا بإستخدام العبارة yield في الارجاع فانه لاينهي الدالة ولايمسح مابها من متغيرات, بل يقوم بتأجيلها ونستطيع الرجوع لها في المستقبل واستئناف تنفيذها من السطر الذي تم الوقوف عنده. وهكذا نستطيع تشبيه عمل الكروتين بعمل العبارة yield. كل هذه الامور (من مفاهيم نمط الـ Iterator وعمله كـ Sequences والـ Producer) سنراها في الدروس المتقدمة مع القنوات Channels والتدفق Flow.

 

في هذا الدرس تعرفنا على الكروتين في لغة الكوتلن. والذي يعتبر كائن قابل للتأجيل والاستئناف ينقل الشفرات الى المعالج لينفذها. إي انه يشابه في عمله الخيط الحاسوبي الـ Thread ورأينا مايتميز به عنه. في الدرس القادم سنرى طرق إنشاء الكروتين.

 

المصادر

  • Kotlin Documenation.
  • كتاب Learning Concurrency in Kotlin.

المحاضر

Mohammad Laif

محتوى الدورة

الكلمات الدليلية

عن الدرس

2 إعجاب
1 متابع
0 مشاركة
1776 مشاهدات
منذ 4 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !