Kotlin में कार्य कतारों का परिचय
आधुनिक सॉफ्टवेयर विकास में, अक्सर कार्यों को एसिंक्रोनस रूप से संसाधित करने की आवश्यकता होती है, विशेष रूप से नेटवर्क अनुरोधों, इनपुट-आउटपुट संचालन या पृष्ठभूमि गणनाओं के साथ काम करते समय। कार्य कतारें (task queues) प्रमुख पैटर्न में से एक हैं जो मुख्य थ्रेड को ब्लॉक किए बिना कार्यों के क्रमबद्ध निष्पादन को व्यवस्थित करने की अनुमति देती हैं। Kotlin भाषा में, JVM के साथ इसके घनिष्ठ एकीकरण और कोरूटीन के मूल समर्थन के कारण, कतारों का कार्यान्वयन सुरुचिपूर्ण और कुशल हो जाता है।
इस लेख में, हम देखेंगे कि Kotlin में कार्य कतारों को कैसे बनाया और प्रबंधित किया जाए, क्लासिकल दृष्टिकोण (थ्रेड-आधारित) और कोरूटीन की आधुनिक क्षमताओं दोनों का उपयोग करके। आप विभिन्न प्रकार की कतारों, उनके लाभों के बारे में जानेंगे और व्यावहारिक कोड उदाहरण प्राप्त करेंगे जिन्हें आप तुरंत अपनी परियोजनाओं में लागू कर सकते हैं।
कार्य कतारों को लागू करने के मुख्य दृष्टिकोण
Kotlin में कार्य कतारों को लागू करने के कई तरीके हैं। दृष्टिकोण का चुनाव प्रदर्शन, जटिलता और उपयोग किए गए वातावरण की आवश्यकताओं पर निर्भर करता है।
1. थ्रेड-आधारित कतारें (BlockingQueue)
क्लासिकल तरीका जो Java में उपयोग किया जाता है और Kotlin के साथ पूरी तरह से संगत है। java.util.concurrent पैकेज से BlockingQueue ब्लॉकिंग ऑपरेशन के साथ एक थ्रेड-सुरक्षित कतार प्रदान करता है। यह दृष्टिकोण मल्टीथ्रेडेड अनुप्रयोगों के लिए उपयुक्त है जहां कई वर्कर कार्यों को संसाधित करते हैं।
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. कोरूटीन-आधारित कतारें (Channel)
Kotlin Coroutines एक अधिक हल्का तंत्र प्रदान करता है — Channel। चैनल थ्रेड्स को ब्लॉक किए बिना कोरूटीन के बीच डेटा स्थानांतरित करने की अनुमति देते हैं। यह एसिंक्रोनस अनुप्रयोगों के लिए एक आदर्श समाधान है।
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