Coroutines لكوتلن: دليل شامل مع أمثلة

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

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

ابدأ الدورة

ما هي Coroutines ولماذا نحتاجها؟

\n\n

Coroutines (الروتينات المتعاونة) هي أداة قوية للبرمجة غير المتزامنة في Kotlin، تتيح لك كتابة كود غير محظور بأسلوب أمري. على عكس الخيوط التقليدية (threads)، فإن الكوروتينات خفيفة الوزن: يمكنك تشغيل آلاف الكوروتينات على خيط واحد دون استهلاك كبير للذاكرة.

\n\n

المهمة الأساسية لـ Coroutines هي تبسيط العمل مع العمليات غير المتزامنة: طلبات الشبكة، القراءة من قاعدة البيانات، عمليات الملفات، والمهام الأخرى التي تتطلب الانتظار. بدلاً من استخدام الاستدعاءات المعقدة (callbacks) أو التدفقات التفاعلية، تكتب كودًا تسلسليًا يتوقف مؤقتًا أثناء الانتظار ويستأنف بعد اكتمال العملية.

\n\n

مكتبة Coroutines هي جزء من نظام Kotlin البيئي ويتم دعمها رسميًا من قبل JetBrains. تُستخدم على نطاق واسع في تطوير Android، تطبيقات الخادم (Ktor، Spring WebFlux) وحتى في تطبيقات سطح المكتب.

\n\n

تثبيت Coroutines

\n\n

نظرًا لأن Coroutines ليست مكتبة منفصلة يتم تثبيتها عبر pip أو npm، بل هي جزء من نظام Kotlin البيئي، فإن إضافتها تعتمد على مدير البناء الخاص بك.

\n\n

Gradle (Kotlin DSL)

\n
dependencies {\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")\n    // لنظام Android أو استخدام Dispatchers.Main\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")\n}
\n\n

Gradle (Groovy DSL)

\n
dependencies {\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0'\n    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'\n}
\n\n

Maven

\n
<dependency>\n    <groupId>org.jetbrains.kotlinx</groupId>\n    <artifactId>kotlinx-coroutines-core</artifactId>\n    <version>1.9.0</version>\n</dependency>
\n\n

بداية سريعة: المثال الأول

\n\n

لنكتب برنامجًا بسيطًا يقوم بتشغيل كوروتين، ويتوقف مؤقتًا، ثم يطبع رسالة:

\n\n
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n    println("بداية البرنامج: ${Thread.currentThread().name}")\n    \n    launch {\n        delay(1000L) // إيقاف الكوروتين مؤقتًا لمدة ثانية واحدة (دون حظر الخيط)\n        println("العالم! (من الكوروتين: ${Thread.currentThread().name})")\n    }\n    \n    println("مرحبًا، (من main: ${Thread.currentThread().name})")\n    delay(500L) // ننتظر حتى يتسنى للكوروتين التنفيذ\n    println("نهاية البرنامج")\n}
\n\n

المخرجات:

\n
بداية البرنامج: main @coroutine#1\nمرحبًا، (من main: @coroutine#1)\nالعالم! (من الكوروتين: @coroutine#2)\nنهاية البرنامج
\n\n

لاحظ: delay() لا يحظر الخيط، بل يوقف الكوروتين الحالي فقط. يظل الخيط main حرًا للمهام الأخرى.

\n\n

الطرق والوظائف الأساسية لـ Coroutines

\n\n

1. runBlocking

\n

ما يفعله: يقوم بتشغيل كوروتين جديد ويحظر الخيط الحالي حتى اكتماله. يُستخدم كجسر بين الكود المتزامن العادي وعالم الكوروتينات (عادةً في الدالة main أو الاختبارات).

\n

المعلمات:

\n
    \n
  • context: CoroutineContext — سياق الكوروتين (افتراضيًا EmptyCoroutineContext)
  • \n
  • block: suspend CoroutineScope.() -> T — كتلة قابلة للإيقاف سيتم تنفيذها
  • \n
\n

مثال:

\n
fun main() {\n    val result = runBlocking {\n        delay(1000L)\n        "تم!"\n    }\n    println(result) // سيطبع: تم!\n}
\n\n

2. launch

\n

ما يفعله: يقوم بتشغيل كوروتين جديد لا يُرجع نتيجة (مشابه لمبدأ أطلق وانسى). يُرجع كائن Job يمكن استخدامه للإلغاء أو الانتظار.

\n

المعلمات:

\n
    \n
  • context: CoroutineContext

توصيات