الموزعين الـ Dispatchers

Mohammad Laifمنذ 4 سنوات

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

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

 

في هذا الدرس سنتعرف على المرسلين او الموزعين Dispatchers والتي تكمن وظيفتهم في وضع الكروتين على الخيط الحاسوبي. ففي الدرسين السابقين تعرفنا على النطاقات Scopes والتي تحدد أماكن إنشاء الكروتين ثم تعرفنا على البنائين Builders والذي من خلالهم نستطيع بناء الكروتين. والآن حان الوقت لوضع الكروتينات على الخيط الحاسوبية باستخدام الموزعين\المرسلين Dispatchers.

 

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

  • المرسلين الـ Dispatchers.
  • أنواع الـ Dispatchers.
    •  النوع الأول الـ Default.
    • النوع الثاني الـ IO.
    • النوع الثالث الـ Unconfined.
    • النوع الرابع الـ Main.
  • متى أستخدم هذه الأنواع.
  • الدوال التأجيلية Suspending Functions والـ Dispatchers.

 

المرسلين الـ Dispatchers

في البداية قلنا ان الروتين المساعد يعيش بداخل الخيوط الحاسوبية ويستطيع التنقل بينهم. هنا تكمن وظيفة المرسلين Dispatchers فهم المسؤولون عن إرسال ووضع الكروتين في خيط حاسوبي ما أو نقله الى خيط آخر أن صح التعبير. نستطيع تحديد المرسل Dispatcher بشكل ظاهري Explicit وذلك بكتابة النوع الذي نريده او بشكل خفي Implicit وذلك من خلال جعل الأمر متروك في يد النطاقات Scopes.

 

أنواع الـ Dispatchers

 

النوع الأول الـ Default

هذا النوع يطبق بشكل ضمني أي لانحتاج الى كتابته ظاهرياً, إلا اذا اردنا ان نكون على درايه به. يستخدم هذا النوع للمهام الثقيلة والتي تتطلب جهد كبير من المعالج كالخوارزميات وما شابه ذلك. بالعادة هو يمثل بركة من الخيوط الحاسوبية عددها ٦٤ خيط حاسوبي (ماهو نمط الـ Thread Pools (الـ Executors)).

مثال برمجي:

GlobalScope.launch(Dispatchers.Default) {  }

 

النوع الثاني الـ IO

أسم هذا النوع يمثل المدخل Input والمخرج Output. يستخدم هذا النوع لكل المهام التي تتطلب التعامل مع كيان آخر خارج عن التطبيق. مثلاً في اليد اليمنى يوجد تطبيق الاندرويد, وفي اليد اليسرى ربما يوجد نظام ملفات خارجي, قواعد بيانات, سيرفرات وما الى ذلك. يتميز هذا النوع بإنشاء بركة من الخيوط الحاسوبية كذلك, وفي داخلها يتم وضع الروتينات المساعدة.

مثال برمجي:

GlobalScope.launch(Dispatchers.IO) {  }

 

النوع الثالث الـ Unconfined

أما هذا النوع يستخدم لوضع الكروتينات على أي خيط حاسوبي بدون تحديد. بالعادة لا ينصح باستخدامه فأنت لاتدري أين سيتم وضع الكاروتين, إلا إذا كنت لا تبالي.

مثال برمجي:

GlobalScope.launch(Dispatchers.Unconfined) {  }

 

النوع الرابع الـ Main

أسم هذا النوع يمثل الخيط الحاسوبي الرئيسي Main Thread او بما يسمى Thread UI. فإذا أردنا وضع كروتين في الخيط الرئيسي نستخدم هذا النوع. مع الانتباه إلى أن هذا النوع متوفر في بيئة تطوير الاندرويد. ويجب مراعات الشفرة التي نريد تشغيلها على هذا الخيط بحيث تكون خفيفه جداً ولاتهلكه.

مثال برمجي:

GlobalScope.launch(Dispatchers.Main) {  }

 

متى أستخدم هذه الأنواع

اذا كانت لديك مهمة تتطلب جهد كبير جداً كعملية خوارزمية بحث أو ترتيب لشئ ما, الحل الأمثل لها هو Default. ولكن بالعادة ستكثر من استخدام النوع IO فهو مناسب لعمل طلبات من السيرفرات API Requests وايضاً للتعامل مع قواعد البيانات أو قراءة الملفات وما الى ذلك من أمور اعتيادية. أما إذا كنت لا تهتم في أين سيتم وضع الكروتين فتستطيع استخدام Unconfined. وفي النهاية إذا كنت في حاجة لعمل مهام على الخيط الرئيسي مثلاً رسم شئ في شاشة المستخدم أو إظهار له نتيجه فسيكون النوع Main هو المناسب.

 

الدوال التأجيلية Suspending Functions والـ Dispatchers

بالنسبة للدوال التأجيلية سنتعرف عليها في الدرس القادم. المهم الان هو جزئية الـ Dispatchers فيصعب على الدوال التأجيلية تحديده. لذلك وجدت دوال تساعدنا على ذلك ومنها الدالة withContext والتي تسمح لك بتحديد المرسل Dispatcher بداخل هذه الدوال.

مثال برمجي:

// We are in: Main Thread.
val result: String = withContext(Dispatchers.IO) {
    // Now we are in: Background Thread.
    "Mohammad"
}

// We back again on: Main Thread with the result.
println(result)

 

الى هنا نصل الى نهاية هذا القسم "مكونات الكروتين". وفي القسم القادم سيكون هناك درس خاص عن الدوال التأجيلية.

 

المصادر

  • كوتلن Docs.

المحاضر

Mohammad Laif

محتوى الدورة

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

عن الدرس

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

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

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

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