launch — সারমর্ম, fire-and-forget করুটিন লঞ্চ এবং এটি কীভাবে কাজ করে

লেখক: IT Sectr প্রকাশিত: 2026-06-22 পড়ার সময়: 7 মিনিট

launch — Kotlin-এ একটি Coroutine Builder যা ফলাফল ফেরত না দিয়ে একটি করুটিন শুরু করে, নির্বাহ নিয়ন্ত্রণের জন্য একটি Job অবজেক্ট ফেরত দেয়। এই বিল্ডার fire-and-forget প্যাটার্ন বাস্তবায়ন করে: করুটিন ব্যাকগ্রাউন্ড থ্রেডে কাজ শুরু করে এবং স্বয়ংক্রিয়ভাবে সম্পন্ন হয়। JetBrains ডকুমেন্টেশন, 2024 অনুসারে, launch Kotlin Coroutines-এ সমান্তরাল কাজ চালানোর প্রাথমিক উপায়।

মূল বিষয়

  • launch — ফলাফল না ফেরতিয়ে করুটিন শুরু করার জন্য বিল্ডার (fire-and-forget)
  • Job — cancel(), join(), isActive পদ্ধতি সহ করুটিন নিয়ন্ত্রণ অবজেক্ট
  • launch চাইল্ড করুটিন স্বয়ংক্রিয় বাতিলের জন্য CoroutineScope-এর সাথে সংহত হয়
  • CoroutineStart.LAZY স্পষ্ট start() বা join() কল পর্যন্ত নির্বাহ স্থগিত করার অনুমতি দেয়
  • launch Android-এ ডেটাবেস সংরক্ষণ, নেটওয়ার্ক কল এবং UI আপডেটের জন্য ব্যবহৃত হয়

Kotlin Coroutines-এ launch কী?

launch একটি Kotlin এক্সটেনশন ফাংশন, যা kotlinx.coroutines ইম্পোর্টের মাধ্যমে পাওয়া যায়, যা একটি নির্দিষ্ট CoroutineScope-এ একটি নতুন করুটিন তৈরি করে। সাধারণ ফাংশনের বিপরীতে, launch-এর ভিতরের কোড সমবর্তীভাবে নির্বাহিত হয় — করুটিন থ্রেড ব্লক না করে স্থগিত (suspend) হতে পারে এবং পরে পুনরায় শুরু হতে পারে।

launch বিল্ডার Kotlin করুটিন মডেলের একটি মৌলিক বিল্ডিং ব্লক। এটি একটি গণনাকৃত মান ফেরত দেয় না কিন্তু একটি Job অবজেক্ট ফেরত দেয় যা করুটিন নির্বাহ নিয়ন্ত্রণের অনুমতি দেয়। অন্য করুটিনের ভিতরে launch-এর মাধ্যমে শুরু করা সমস্ত চাইল্ড করুটিন প্যারেন্টের সাথে আবদ্ধ থাকে।

launch-এর সিনট্যাক্স এবং প্যারামিটার

launch বিল্ডারকে বেশ কয়েকটি প্যারামিটার সহ একটি ইনলাইন ফাংশন হিসাবে সংজ্ঞায়িত করা হয়েছে: CoroutineScope, CoroutineContext, CoroutineStart এবং একটি suspend ব্লক। প্যারামিটারগুলির ডিফল্ট মান রয়েছে, যা launch-কে সাধারণ পরিস্থিতির জন্য সুবিধাজনক করে তোলে।

kotlin
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 — ফেরত দেওয়া অবজেক্ট যা করুটিনের জীবনচক্র উপস্থাপন করে। Job অবস্থায় থাকতে পারে: New, Active, Completing, Completed, Cancelling, Cancelled। প্রতিটি অবস্থা নির্বাহের স্থিতি প্রতিফলিত করে এবং পরিবর্তনগুলিতে প্রতিক্রিয়া জানাতে দেয়।

kotlin
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 এই আচরণ পরিবর্তন করে — একটি চাইল্ড ব্যর্থ হলে চাইল্ড করুটিনগুলি বাতিল হয় না।

launch-এ গঠনমূলক সমবর্তিতা

গঠনমূলক সমবর্তিতার অর্থ হল প্রতিটি করুটিন একটি নির্দিষ্ট CoroutineScope-এর ভিতরে শুরু হয় এবং scope সম্পন্ন হয় না যতক্ষণ না সমস্ত চাইল্ড করুটিন তাদের কাজ শেষ করে। launch এই নীতিটিকে সম্পূর্ণরূপে সমর্থন করে — অন্য করুটিনের ভিতরে শুরু করা করুটিনগুলি তার চাইল্ড।

নেস্টেড launch কল

নেস্টেড launch কলের মাধ্যমে, করুটিনগুলির একটি গাছ গঠিত হয়। প্যারেন্ট করুটিন সমস্ত চাইল্ড সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে, যা পূর্বাভাসযোগ্য নির্বাহ ক্রম নিশ্চিত করে এবং সম্পদ ব্যবস্থাপনা সরল করে।

kotlin
fun main() = runBlocking {
    launch {
        launch {
            delay(1000L)
            println("চাইল্ড 1 সম্পন্ন")
        }
        launch {
            delay(500L)
            println("চাইল্ড 2 সম্পন্ন")
        }
        println("সকল চাইল্ড এই লাইনের আগে সম্পন্ন হয়")
    }
}

এই আচরণ থ্রেড-ভিত্তিক সমবর্তিতা থেকে ভিন্ন, যেখানে চাইল্ড থ্রেডগুলি প্যারেন্টের সাথে আবদ্ধ নয়। করুটিনে, প্যারেন্ট সম্পন্ন হয় না যতক্ষণ না সমস্ত চাইল্ড তাদের কাজ শেষ করে।

launch-এ ব্যতিক্রম হ্যান্ডলিং

launch-এ ব্যতিক্রম হ্যান্ডলিং Job-এর প্রকারের উপর নির্ভর করে। সাধারণ Job-এর জন্য, ব্যতিক্রমগুলি প্যারেন্ট করুটিনে প্রচারিত হয় এবং এটি বাতিল করে। SupervisorJob বা SupervisorScope-এর জন্য, ব্যতিক্রমগুলি বিচ্ছিন্ন হয় — একটি চাইল্ড করুটিনে ত্রুটি অন্যদের প্রভাবিত করে না।

kotlin
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
    try {
        riskyOperation()
    } catch (e: Exception) {
        println("ধরা হয়েছে: ${e.message}")
    }
}
scope.launch {
    println("এটি এখনও SupervisorJob-এর কারণে চলে")
}

অধরা ব্যতিক্রমগুলির বৈশ্বিক হ্যান্ডলিংয়ের জন্য, CoroutineExceptionHandler ব্যবহার করা হয়। এটি সেই ব্যতিক্রমগুলি ধরে যা করুটিনের ভিতরে হ্যান্ডল করা হয়নি এবং অ্যাপ্লিকেশন ক্র্যাশ না করে ত্রুটি লগ করার অনুমতি দেয়।

Android-এ launch ব্যবহারের উদাহরণ

Android-এ, launch সর্বত্র ব্যবহৃত হয়: ViewModel থেকে WorkManager পর্যন্ত। প্রধান প্যাটার্ন হল কম্পোনেন্ট জীবনচক্র শেষ হলে স্বয়ংক্রিয় করুটিন বাতিলের জন্য Fragment-এ lifecycleScope এবং ViewModel-এ viewModelScope ব্যবহার করা।

kotlin
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 ব্যবহার করা যেতে পারে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

Kotlin Coroutines-এ launch এবং async-এর মধ্যে পার্থক্য কী?

launch Job ফেরত দেয় এবং ফলাফল ফেরত দেয় না, যেখানে async ফলাফল পাওয়ার জন্য Deferred<T> ফেরত দেয়। launch fire-and-forget অপারেশনের জন্য ব্যবহৃত হয়, async — যখন আপনাকে ফেরত দেওয়া মানের জন্য অপেক্ষা করতে এবং এটি ব্যবহার করতে হবে।

launch-এর মাধ্যমে শুরু করা করুটিন কীভাবে বাতিল করবেন?

সংরক্ষিত Job অবজেক্টে job.cancel() কল করুন। গ্রুপ বাতিলের জন্য, scope.cancel()-এর মাধ্যমে সম্পূর্ণ CoroutineScope বাতিল করুন। করুটিনকে সহযোগী হতে হবে — isActive চেক করুন বা বাতিলযোগ্য suspend ফাংশন ব্যবহার করুন।

launch ব্যতিক্রম নিক্ষেপ করলে কী করবেন?

launch ব্লকের ভিতরে try-catch ব্যবহার করুন বা CoroutineContext-এ CoroutineExceptionHandler পাস করুন। ত্রুটি বিচ্ছিন্নতার জন্য SupervisorJob ব্যবহার করুন — তাহলে একটি চাইল্ড করুটিনে ব্যতিক্রম অন্যগুলিকে বাতিল করবে না।

CoroutineScope ছাড়া launch চালানো যাবে কি?

না, launch CoroutineScope-এর একটি এক্সটেনশন ফাংশন। scope ছাড়া, করুটিন গঠনমূলক সমবর্তিতার নীতি অনুসরণ করতে পারে না। সতর্কতার সাথে GlobalScope.launch ব্যবহার করুন — এটি একটি জীবনচক্র-বিহীন করুটিন তৈরি করে।

একসাথে কতগুলি launch করুটিন চালানো যেতে পারে?

সংখ্যা ডিসপ্যাচার থ্রেড পুল দ্বারা সীমিত। Dispatchers.Default CPU কোরের সংখ্যার সমান থ্রেড ব্যবহার করে। Dispatchers.IO 64টি থ্রেড পর্যন্ত সমর্থন করে। বেশি সংখ্যক করুটিন চালু করলে সেগুলি সারিবদ্ধ হয়।

সারসংক্ষেপ

  • launch — fire-and-forget করুটিনের জন্য প্রধান বিল্ডার, Job অবজেক্ট ফেরত দেয়
  • Job নিয়ন্ত্রণ পদ্ধতি প্রদান করে: cancel(), join(), isActive, isCancelled, isCompleted
  • গঠনমূলক সমবর্তিতা প্যারেন্ট বাতিল হলে চাইল্ড করুটিন বাতিলের নিশ্চয়তা দেয়
  • ব্যতিক্রম হ্যান্ডলিং Job প্রকারের উপর নির্ভর করে: সাধারণ ত্রুটি প্রচার করে, SupervisorJob বিচ্ছিন্ন করে
  • lifecycleScope এবং viewModelScope — Android-এ করুটিন শুরু করার প্রস্তুত সমাধান
  • CoroutineStart.LAZY স্পষ্ট start() বা join() কল পর্যন্ত নির্বাহ স্থগিত করে
  • launch Android-এ নেটওয়ার্ক অনুরোধ, ডেটাবেস লেখা, বিশ্লেষণ এবং ক্যাশিং-এর জন্য ব্যবহৃত হয়

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন