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 বিল্ডারকে বেশ কয়েকটি প্যারামিটার সহ একটি ইনলাইন ফাংশন হিসাবে সংজ্ঞায়িত করা হয়েছে: 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন