Kotlin में एसिंक्रोनस प्रोग्रामिंग: व्यावहारिक रूप से पूर्ण गाइड
\n\nआधुनिक अनुप्रयोगों को उच्च प्रदर्शन और उत्तरदायित्व की आवश्यकता होती है। Kotlin में कोरूटीन (coroutines) के साथ एसिंक्रोनस प्रोग्रामिंग नेटवर्क अनुरोधों, डेटाबेस और फ़ाइल संचालन के लिए डी-फैक्टो मानक बन गया है। इस गाइड में, हम मुख्य अवधारणाओं को समझेंगे, व्यावहारिक उदाहरण दिखाएंगे और आपके प्रोजेक्ट्स में उपयोग के लिए तैयार टेम्पलेट प्रदान करेंगे।
\n\n1. Kotlin में कोरूटीन के मूल सिद्धांत
\n\nकोरूटीन हल्के थ्रेड होते हैं जो मुख्य थ्रेड को ब्लॉक किए बिना फंक्शन के निष्पादन को रोकने की अनुमति देते हैं। पारंपरिक थ्रेड के विपरीत, कोरूटीन को किसी भी समय रोका जा सकता है और बाद में फिर से शुरू किया जा सकता है, जो उन्हें एसिंक्रोनस संचालन के लिए आदर्श बनाता है।
\n\n1.1. डिपेंडेंसी जोड़ना
\nशुरू करने के लिए, build.gradle.kts में डिपेंडेंसी जोड़ें:
dependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") // Android के लिए\n}\n\n1.2. पहला कोरूटीन
\nआइए runBlocking का उपयोग करके एक सरल कोरूटीन बनाएं - सिंक्रोनस और एसिंक्रोनस दुनिया के बीच एक पुल:
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n launch {\n delay(1000L) // नॉन-ब्लॉकिंग विलंब\n println("दुनिया!")\n }\n println("नमस्ते,")\n delay(2000L) // कोरूटीन के पूरा होने की प्रतीक्षा करें\n}\n\nइस उदाहरण में, launch एक नया कोरूटीन शुरू करता है, और delay एक सस्पेंड फंक्शन है जो थ्रेड को ब्लॉक नहीं करता है।
2. Suspend फंक्शन और संरचित समानता
\n\n2.1. Suspend फंक्शन बनाना
\nकोई भी फंक्शन जिसे रोका जा सकता है, उसे suspend मॉडिफायर से चिह्नित किया जाना चाहिए। ऐसे फंक्शन को केवल कोरूटीन या अन्य suspend फंक्शन से ही कॉल किया जा सकता है:
suspend fun fetchUserData(userId: String): User {\n delay(2000L) // नेटवर्क अनुरोध का अनुकरण\n return User(userId, "इवान पेत्रोव")\n}\n\nsuspend fun fetchUserPosts(userId: String): List<Post> {\n delay(1500L)\n return listOf(Post("शीर्षक 1"), Post("शीर्षक 2"))\n}\n\n2.2. अनुक्रमिक निष्पादन
\nडिफ़ॉल्ट रूप से, कोरूटीन एक ही launch के अंदर अनुक्रमिक रूप से निष्पादित होते हैं:
fun main() = runBlocking {\n val time = measureTimeMillis {\n val user = fetchUserData("123")\n val posts = fetchUserPosts("123")\n println("${user.name} के ${posts.size} पोस्ट हैं")\n }\n println("निष्पादन समय: $time मि.से.") // ~3500 मि.से.\n}\n\n2.3. async/await के साथ समानांतर निष्पादन
\nसमानांतर निष्पादन के लिए async और await का उपयोग करें:
fun main() = runBlocking {\n val time = measureTimeMillis {\n val user = async { fetchUserData("123") }\n val posts = async { fetchUserPosts("123") }\n \n println("${user.await().name} के ${posts.await().size} पोस्ट हैं")\n }\n println("निष्पादन समय: $time मि.से.") // ~2000 मि.से. (समानांतर)\n}\n\n3. कोरूटीन डिस्पैचर और संदर्भ
\n\nडिस्पैचर यह निर्धारित करते हैं कि कोरूटीन किस थ्रेड या थ्रेड पूल पर निष्पादित होगा। मुख्य डिस्पैचर:
\n\n- \n
- Dispatchers.Default — CPU-गहन कार्यों के लिए (डिफ़ॉल्ट) \n
- Dispatchers.IO — इनपुट/आउटपुट संचालन के लिए (नेटवर्क, फ़ाइलें) \n
- Dispatchers.Main — UI थ्रेड के लिए (Android, Swing) \n
- Dispatchers.Unconfined — किसी विशिष्ट थ्रेड से बंधा नहीं \n
3.1. Dispatchers.IO के साथ उदाहरण
\nfun main() = runBlocking {\n launch(Dispatchers.IO) {\n // नेटवर्क अनुरोध\n val response = httpClient.get("https://api.example.com/data")\n withContext(Di