launch — Kotlin में एक Coroutine Builder जो बिना परिणाम लौटाए कोरूटीन शुरू करता है, निष्पादन को नियंत्रित करने के लिए Job ऑब्जेक्ट लौटाता है। यह बिल्डर fire-and-forget पैटर्न लागू करता है: कोरूटीन बैकग्राउंड थ्रेड में काम शुरू करता है और स्वचालित रूप से पूरा होता है। JetBrains दस्तावेज़ीकरण, 2024 के अनुसार, launch Kotlin Coroutines में समानांतर कार्यों को चलाने का प्राथमिक तरीका है।
मुख्य बातें
launch एक Kotlin एक्सटेंशन फ़ंक्शन है, जो kotlinx.coroutines आयात के माध्यम से उपलब्ध है, जो दिए गए CoroutineScope में एक नया कोरूटीन बनाता है। सामान्य फ़ंक्शनों के विपरीत, launch के अंदर का कोड समवर्ती रूप से निष्पादित होता है — कोरूटीन बिना थ्रेड को ब्लॉक किए रुक (suspend) सकता है और बाद में फिर से शुरू हो सकता है।
launch बिल्डर Kotlin कोरूटीन मॉडल का मूलभूत निर्माण खंड है। यह गणना किया गया मान नहीं लौटाता बल्कि एक Job ऑब्जेक्ट लौटाता है जो कोरूटीन निष्पादन को नियंत्रित करने की अनुमति देता है। किसी अन्य कोरूटीन के अंदर launch के माध्यम से शुरू किए गए सभी चाइल्ड कोरूटीन पैरेंट से बंधे होते हैं।
launch बिल्डर को कई पैरामीटरों के साथ एक inline फ़ंक्शन के रूप में परिभाषित किया गया है: CoroutineScope, CoroutineContext, CoroutineStart और एक suspend ब्लॉक। पैरामीटरों के डिफ़ॉल्ट मान हैं, जो launch को सामान्य परिदृश्यों के लिए सुविधाजनक बनाते हैं।
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
context पैरामीटर एक CoroutineContext स्वीकार करता है जो डिस्पैचर, अपवाद हैंडलर और नामित तत्व को जोड़ता है। अक्सर Dispatchers.IO, Dispatchers.Main या SupervisorJob त्रुटि पृथक्करण के लिए पारित किया जाता है।
Job — लौटाया गया ऑब्जेक्ट जो कोरूटीन के जीवनचक्र का प्रतिनिधित्व करता है। Job अवस्थाओं में हो सकता है: New, Active, Completing, Completed, Cancelling, Cancelled। प्रत्येक अवस्था निष्पादन स्थिति को दर्शाती है और परिवर्तनों पर प्रतिक्रिया करने की अनुमति देती है।
val job = CoroutineScope(Dispatchers.IO).launch {
repeat(10) { i ->
delay(1000L)
println("प्रगति: $i")
}
}
println("जॉब सक्रिय है: ${job.isActive}")
delay(2500L)
job.cancel()
println("जॉब रद्द है: ${job.isCancelled}")
Job एक पदानुक्रम का समर्थन करता है: यदि पैरेंट कोरूटीन रद्द किया जाता है, तो सभी चाइल्ड स्वचालित रूप से रद्द हो जाते हैं। SupervisorJob इस व्यवहार को बदलता है — चाइल्ड कोरूटीन किसी एक के विफल होने पर रद्द नहीं होते।
संरचित सहसमवर्तीता का अर्थ है कि प्रत्येक कोरूटीन एक विशिष्ट CoroutineScope के अंदर शुरू किया जाता है, और जब तक सभी चाइल्ड कोरूटीन अपना काम पूरा नहीं कर लेते, scope पूरा नहीं होता। launch इस सिद्धांत का पूरी तरह से समर्थन करता है — किसी अन्य कोरूटीन के अंदर शुरू किए गए कोरूटीन उसके चाइल्ड होते हैं।
नेस्टेड launch कॉल के साथ, कोरूटीन का एक पेड़ बनता है। पैरेंट कोरूटीन सभी चाइल्ड के पूरा होने की प्रतीक्षा करता है, जिससे पूर्वानुमानित निष्पादन क्रम सुनिश्चित होता है और संसाधन प्रबंधन सरल होता है।
fun main() = runBlocking {
launch {
launch {
delay(1000L)
println("चाइल्ड 1 पूर्ण")
}
launch {
delay(500L)
println("चाइल्ड 2 पूर्ण")
}
println("सभी चाइल्ड इस पंक्ति से पहले पूर्ण होते हैं")
}
}
यह व्यवहार थ्रेड-आधारित सहसमवर्तीता से भिन्न है, जहाँ चाइल्ड थ्रेड पैरेंट से बंधे नहीं होते। कोरूटीन में, पैरेंट तब तक पूरा नहीं होता जब तक सभी चाइल्ड अपना काम पूरा नहीं कर लेते।
launch में अपवाद प्रबंधन Job के प्रकार पर निर्भर करता है। सामान्य Job के लिए, अपवाद पैरेंट कोरूटीन में प्रसारित होते हैं और उसे रद्द कर देते हैं। SupervisorJob या SupervisorScope के लिए, अपवाद पृथक होते हैं — एक चाइल्ड कोरूटीन में त्रुटि दूसरों को प्रभावित नहीं करती।
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
try {
riskyOperation()
} catch (e: Exception) {
println("पकड़ा गया: ${e.message}")
}
}
scope.launch {
println("यह अभी भी SupervisorJob की बदौलत चलता है")
}
अनकैच अपवादों के वैश्विक प्रबंधन के लिए, CoroutineExceptionHandler का उपयोग किया जाता है। यह उन अपवादों को पकड़ता है जिन्हें कोरूटीन के अंदर संभाला नहीं गया था और एप्लिकेशन को क्रैश किए बिना त्रुटि लॉग करने की अनुमति देता है।
Android में, launch का उपयोग हर जगह किया जाता है: ViewModel से WorkManager तक। मुख्य पैटर्न घटक जीवनचक्र समाप्त होने पर स्वचालित कोरूटीन रद्दीकरण के लिए Fragment में lifecycleScope और ViewModel में viewModelScope का उपयोग है।
class ProfileViewModel : ViewModel() {
private val repository = UserRepository()
fun loadProfile(userId: String) {
viewModelScope.launch(Dispatchers.IO) {
val profile = repository.fetchProfile(userId)
withContext(Dispatchers.Main) {
_profileState.update { it.copy(profile = profile) }
}
}
}
}
viewModelScope ViewModel के नष्ट होने पर स्वचालित रूप से कोरूटीन रद्द कर देता है। यह मेमोरी लीक को समाप्त करता है और सुनिश्चित करता है कि संदर्भ खोने के बाद बैकग्राउंड संचालन जारी न रहे। अतिरिक्त रूप से, डिस्पैचर के बीच स्विच करने के लिए withContext का उपयोग किया जा सकता है।
अक्सर पूछे जाने वाले प्रश्न
launch Job लौटाता है और परिणाम नहीं लौटाता, जबकि async परिणाम प्राप्त करने के लिए Deferred<T> लौटाता है। launch का उपयोग fire-and-forget संचालन के लिए किया जाता है, async — जब आपको लौटाए गए मान की प्रतीक्षा करने और उसका उपयोग करने की आवश्यकता होती है।
सहेजे गए Job ऑब्जेक्ट पर job.cancel() कॉल करें। समूह रद्दीकरण के लिए, scope.cancel() के माध्यम से पूरे CoroutineScope को रद्द करें। कोरूटीन को सहकारी होना चाहिए — isActive जाँचें या रद्द करने योग्य suspend फ़ंक्शन का उपयोग करें।
launch ब्लॉक के अंदर try-catch का उपयोग करें या CoroutineContext में CoroutineExceptionHandler पास करें। त्रुटि पृथक्करण के लिए SupervisorJob का उपयोग करें — तब एक चाइल्ड कोरूटीन में अपवाद दूसरों को रद्द नहीं करेगा।
नहीं, launch CoroutineScope का एक एक्सटेंशन फ़ंक्शन है। बिना scope के, कोरूटीन संरचित सहसमवर्तीता के सिद्धांत का पालन नहीं कर सकता। GlobalScope.launch का सावधानी से उपयोग करें — यह जीवनचक्र से बिना बंधाव का कोरूटीन बनाता है।
संख्या डिस्पैचर थ्रेड पूल द्वारा सीमित है। Dispatchers.Default CPU कोर की संख्या के बराबर थ्रेड का उपयोग करता है। Dispatchers.IO 64 थ्रेड तक समर्थन करता है। अधिक संख्या में कोरूटीन शुरू करने पर वे कतार में लग जाते हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें