البرمجة غير المتزامنة في Kotlin: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة في البرمجة غير المتزامنة في Kotlin

تتطلب التطبيقات الحديثة أداءً عاليًا واستجابة سريعة. البرمجة غير المتزامنة في Kotlin هي أداة قوية تسمح لك بكتابة كود غير مانع للتنفيذ، مع استخدام فعال لموارد النظام. على عكس تعدد الخيوط التقليدي، توفر coroutines في Kotlin خيوط تنفيذ خفيفة الوزن يمكن تعليقها واستئنافها دون حظر الخيط الرئيسي.

في هذا الدليل، سنقوم بتفصيل المفاهيم الأساسية للبرمجة غير المتزامنة في Kotlin: من coroutines الأساسية إلى الأنماط المتقدمة باستخدام Flow و Channel. ستتعلم كيفية إنشاء تطبيقات غير متزامنة فعالة ستعمل بسرعة وموثوقية.



أساسيات Coroutines في Kotlin

ما هو Coroutine؟

Coroutine هو خيط تنفيذ خفيف الوزن يمكن تعليقه في نقطة واستئنافه في نقطة أخرى. في Kotlin، يتم تنفيذ coroutines على مستوى اللغة باستخدام الكلمة المفتاحية suspend وأدوات بناء خاصة.



تشغيل أول Coroutine

للعمل مع coroutines، تحتاج إلى إضافة تبعية في build.gradle.kts:

dependencies {    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}

مثال أساسي لتشغيل coroutine:

import kotlinx.coroutines.*

fun main() = runBlocking { launch { delay(1000L) println("World!") } println("Hello,")}

نتيجة التنفيذ:

Hello,World!


دوال Suspend

دوال suspend هي دوال يمكنها تعليق تنفيذ coroutine دون حظر الخيط. يتم تمييزها بالكلمة المفتاحية suspend:

suspend fun fetchUserData(): String {    delay(2000L) // محاكاة طلب شبكة    return "User data"}

fun main() = runBlocking { val data = fetchUserData() println(data)}


إدارة Coroutines: النطاق والموزعين

CoroutineScope

CoroutineScope يحدد دورة حياة coroutines. يتم تشغيل جميع coroutines ضمن نطاق معين. إذا تم إلغاء النطاق، فسيتم إلغاء جميع coroutines الفرعية أيضًا.

class MyViewModel : ViewModel() {    private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())        fun loadData() {        scope.launch {            val data = fetchData()            updateUI(data)        }    }        override fun onCleared() {        super.onCleared()        scope.cancel()    }}


الموزعين: اختيار خيط التنفيذ

يحدد الموزعون على أي مجموعة خيوط سيتم تنفيذ coroutine. الأنواع الرئيسية:

  • Dispatchers.Main — لخيط واجهة المستخدم (Android, JavaFX)
  • Dispatchers.IO — لعمليات الإدخال/الإخراج (الشبكة، الملفات)
  • Dispatchers.Default — للمهام المكثفة بوحدة المعالجة المركزية
  • Dispatchers.Unconfined — غير مرتبط بخيط معين
fun main() = runBlocking {    launch(Dispatchers.IO) {        println("Executing on IO: ${Thread.currentThread().name}")    }    launch(Dispatchers.Default) {        println("Executing on Default: ${Thread.currentThread().name}")    }}


تقنيات متقدمة: async/await وإلغاء Coroutine

التنفيذ المتوازي مع async

أداة البناء async تسمح لك بتشغيل مهام متعددة بالتوازي والحصول على النتائج باستخدام await():

suspend fun fetchDataFromApi1(): String {    delay(1000L)    return "Result from API 1"}

suspend fun fetchDataFromApi2(): String { delay(1500L) return "Result from API 2"}

fun main() = runBlocking { val time = measureTimeMillis { val result1 = async { fetchDataFromApi1() } val

المدونات

توصيات الكتب