قوائم المهام في Kotlin: الإنشاء والإدارة والتحسين

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

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

ابدأ الدورة

مقدمة في قوائم المهام في Kotlin

في تطوير البرمجيات الحديثة، غالبًا ما تنشأ الحاجة إلى معالجة المهام بشكل غير متزامن، خاصة عند العمل مع طلبات الشبكة، عمليات الإدخال/الإخراج، أو الحسابات الخلفية. قوائم المهام (task queues) هي أحد الأنماط الرئيسية التي تسمح بتنظيم تنفيذ المهام بشكل منظم، مع تجنب حظر الخيط الرئيسي. في لغة Kotlin، بفضل تكاملها الوثيق مع JVM والدعم الأصلي للـ coroutines، يصبح تنفيذ قوائم المهام أنيقًا وفعالًا.

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



الأساليب الأساسية لتنفيذ قوائم المهام

في Kotlin، توجد عدة طرق لتنفيذ قوائم المهام. يعتمد اختيار الأسلوب على متطلبات الأداء، التعقيد، والبيئة المستخدمة.



1. قوائم المهام القائمة على الخيوط (BlockingQueue)

الطريقة التقليدية المستخدمة في Java والمتوافقة تمامًا مع Kotlin. توفر BlockingQueue من حزمة java.util.concurrent قائمة مهام آمنة للخيوط مع عمليات حظر. هذا الأسلوب مناسب تمامًا للتطبيقات متعددة الخيوط حيث يقوم عدة عمال بمعالجة المهام.

import java.util.concurrent.BlockingQueueimport java.util.concurrent.LinkedBlockingQueue

class ThreadBasedTaskQueue { private val queue: BlockingQueue<Runnable> = LinkedBlockingQueue() private val workers: List<Thread>

constructor(workerCount: Int) { workers = (1..workerCount).map { workerId -> Thread { while (true) { val task = queue.take() // يتم الحظر حتى توجد مهام try { task.run() } catch (e: Exception) { println("Worker $workerId error: ${e.message}") } } }.apply { start() } } }

fun submit(task: Runnable) { queue.put(task) }}

// الاستخدامfun main() { val taskQueue = ThreadBasedTaskQueue(4) repeat(10) { index -> taskQueue.submit { println("Task $index executed by ${Thread.currentThread().name}") } } Thread.sleep(1000)}

المزايا: البساطة، السلوك المتوقع، العزل الجيد للمهام. العيوب: التكاليف الإضافية لإنشاء الخيوط، العدد المحدود للخيوط في النظام.



2. قوائم المهام القائمة على الـ coroutines (Channel)

تقدم Kotlin Coroutines آلية أخف وزنًا — Channel. تسمح القنوات بنقل البيانات بين الـ coroutines دون حظر الخيوط. هذا هو الحل المثالي للتطبيقات غير المتزامنة.

import kotlinx.coroutines.*import kotlinx.coroutines.channels.Channel

class CoroutineTaskQueue(private val workerCount: Int = 4) { private val channel = Channel<suspend () -> Unit>(Channel.UNLIMITED)

fun start(scope: CoroutineScope) { repeat(workerCount) { workerId -> scope.launch { for (task in channel) { try { task() } catch (e: Exception) { println("Coroutine worker $workerId error: ${e.message}") } } } } }

suspend fun submit(task: suspend () -> Unit) { channel.send(task) }}

// الاستخدامfun main() = runBlocking { val taskQueue = CoroutineTaskQueue(4) taskQueue.start(this)

repeat(10) { index -> taskQueue.submit { delay(100) pr

المدونات

توصيات الكتب