Coroutines কটলিনের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে সহজ করে। এর সঠিক ব্যবহারের জন্য Coroutine Scope এবং Coroutine Context এর ধারণা বোঝা খুবই জরুরি।
Coroutine Scope এবং Context
নিচে এদের সম্পর্কে বিস্তারিত আলোচনা করা হলো।
১. Coroutine Scope
Coroutine Scope একটি কনটেক্সট তৈরি করে যা নির্ধারণ করে coroutines কিভাবে এবং কোথায় চালানো হবে। এটি একটি coroutine-এর জীবনচক্র এবং ব্যবস্থাপনা পরিচালনা করে।
i) Scope এর ভূমিকা
- Lifecycle Management: Coroutine scope-এর মধ্যে তৈরি করা coroutines এর জীবনচক্র সেই scope-এর জীবনচক্রের সাথে যুক্ত থাকে। যখন scope শেষ হয়, তখন সেই scope-এর সব coroutine স্বয়ংক্রিয়ভাবে বাতিল হয়।
- Structured Concurrency: Coroutine scope structured concurrency কে সমর্থন করে, যা নিশ্চিত করে যে coroutines সঠিকভাবে সম্পন্ন হয় এবং resources সঠিকভাবে মুক্ত হয়।
ii) Coroutine Scope-এর উদাহরণ
import kotlinx.coroutines.*
fun main() = runBlocking { // runBlocking একটি coroutine scope
launch { // নতুন coroutine তৈরি
delay(1000L)
println("World!")
}
println("Hello,") // এটি তাত্ক্ষণিকভাবে চলবে
}
ব্যাখ্যা:
- এখানে
runBlockingএকটি coroutine scope তৈরি করেছে, যার ভিতরেlaunchব্যবহার করে একটি নতুন coroutine শুরু করা হয়েছে।runBlockingব্লকটি শেষ না হওয়া পর্যন্ত মেইন থ্রেড ব্লক থাকে।
২. Coroutine Context
Coroutine Context হলো একটি coroutine-এর সব তথ্য ধারণকারী একটি অবজেক্ট। এটি coroutine-এর বিভিন্ন বৈশিষ্ট্য যেমন, dispatcher, job, এবং coroutine name ধারণ করে।
i) Context-এর উপাদান
- Dispatcher: এটি নির্ধারণ করে coroutine কোন থ্রেডে চলবে। উদাহরণস্বরূপ,
Dispatchers.Main,Dispatchers.IO, এবংDispatchers.Default। - Job: এটি coroutine-এর জীবনচক্র নিয়ন্ত্রণ করে এবং এটিকে বাতিল করতে সক্ষম করে। আপনি একটি coroutine-এর সাথে একটি Job যুক্ত করতে পারেন।
- Coroutine Name: এটি coroutine-এর নাম নির্ধারণ করে, যা debugging এর জন্য সহায়ক হতে পারে।
ii) Coroutine Context-এর উদাহরণ
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch(Dispatchers.IO) { // IO dispatcher ব্যবহার করে coroutine শুরু
println("Running on thread: ${Thread.currentThread().name}")
}
job.join() // Coroutine সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করুন
}
ব্যাখ্যা:
- এখানে
launch(Dispatchers.IO)ব্যবহার করে coroutine তৈরি করা হয়েছে, যা IO কাজের জন্য উপযুক্ত।job.join()coroutine শেষ হওয়া পর্যন্ত অপেক্ষা করে।
৩. Coroutine Scope এবং Context এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Coroutine Scope | Coroutine Context |
|---|---|---|
| Definition | Coroutine-এর জীবনচক্র নির্ধারণ করে | Coroutine-এর বৈশিষ্ট্য এবং তথ্য ধারণ করে |
| Purpose | Structured concurrency এবং lifecycle management | Dispatcher, Job, Coroutine Name ইত্যাদি ধারণ করে |
| Usage | Coroutine তৈরি করার সময় scope ব্যবহৃত হয় | Coroutine তৈরি বা চালানোর সময় context নির্ধারণ করে |
৪. Coroutine Context এর সাথে Customization
আপনি নিজের coroutine context তৈরি করতে পারেন, যেখানে dispatcher, job, এবং অন্যান্য প্রোপার্টি অন্তর্ভুক্ত করা হয়।
উদাহরণ:
fun main() = runBlocking {
val customContext = Job() + Dispatchers.Default // Custom context তৈরি
val job = launch(customContext) {
println("Running on thread: ${Thread.currentThread().name}")
}
job.join() // Coroutine সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করুন
}
ব্যাখ্যা:
- এখানে
customContextতৈরি করা হয়েছে যাJobএবংDispatchers.Defaultএকত্রিত করেছে।
Coroutine Scope এবং Coroutine Context কটলিনে coroutines পরিচালনার জন্য গুরুত্বপূর্ণ। Scope coroutine-এর জীবনচক্র এবং ব্যবস্থাপনা নিশ্চিত করে, যেখানে Context coroutine-এর বিভিন্ন বৈশিষ্ট্য ধারণ করে। এই দুটির সঠিক ব্যবহার অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংকে আরও কার্যকর এবং সংগঠিত করে তোলে।
Read more