ما هي Coroutines ولماذا نحتاجها؟
\n\nCoroutines (الروتينات المتعاونة) هي أداة قوية للبرمجة غير المتزامنة في 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\nGradle (Kotlin DSL)
\ndependencies {\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\nGradle (Groovy DSL)
\ndependencies {\n implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0'\n implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'\n}\n\nMaven
\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\nimport 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 حرًا للمهام الأخرى.
الطرق والوظائف الأساسية لـ Coroutines
\n\n1. runBlocking
\nما يفعله: يقوم بتشغيل كوروتين جديد ويحظر الخيط الحالي حتى اكتماله. يُستخدم كجسر بين الكود المتزامن العادي وعالم الكوروتينات (عادةً في الدالة main أو الاختبارات).
\nالمعلمات:
\n- \n
context: CoroutineContext— سياق الكوروتين (افتراضيًا EmptyCoroutineContext) \n block: suspend CoroutineScope.() -> T— كتلة قابلة للإيقاف سيتم تنفيذها \n
مثال:
\nfun main() {\n val result = runBlocking {\n delay(1000L)\n "تم!"\n }\n println(result) // سيطبع: تم!\n}\n\n2. launch
\nما يفعله: يقوم بتشغيل كوروتين جديد لا يُرجع نتيجة (مشابه لمبدأ أطلق وانسى). يُرجع كائن Job يمكن استخدامه للإلغاء أو الانتظار.
\nالمعلمات:
\n- \n
context: CoroutineContext