Coroutine؛ چندکاری بدون قفل کردن برنامه
برنامه منتظر اینترنت بمونه ولی خشک نزنه؟ بفرما کوروتین.
Coroutine چیه؟
کوروتین یه محاسبهی suspendableه؛ یعنی میتونه وسط کار وایسه بدون اینکه نخ سیستم رو بیخودی قفل کنه. برای شبکه، دیتابیس، تایمر و کارهای async خیلی مهمه. خلاصه همزمانی بدون جنگ اعصاب callbackها.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
suspend و delay
تابع suspend میتونه متوقف بشه و بعد ادامه بده. `delay` مثل `sleep` نیست که نخ رو بخوابونه؛ همکاری میکنه و منابع رو الکی گروگان نمیگیره.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
suspend fun fetchUser(): String {
delay(1000)
return "کاربر آماده است"
}
fun main() = runBlocking {
println(fetchUser())
}
بعد از حدود یک ثانیه: کاربر آماده است
launch برای اجرای همزمان
با `launch` کاری رو شروع میکنی که نتیجه مستقیم برنمیگردونه. مثل اینکه یکی رو بفرستی چایی بیاره، خودت هم ادامه بدی.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(500)
println("کار پسزمینه تموم شد")
}
println("برنامه هنوز زندهست")
}
برنامه هنوز زندهست کار پسزمینه تموم شد
async و await
اگر نتیجه میخوای، `async` بزن و با `await` بگیر. برای چند درخواست همزمان عالیه؛ البته بیحساب همزمانی نساز که سرور بدبخت نفسش بگیره.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
import kotlinx.coroutines.*
fun main() = runBlocking {
val a = async { 10 }
val b = async { 20 }
println(a.await() + b.await())
}
30
نتیجه این درس 🎯
Coroutine یعنی کارهای زمانبر را بدون قفل کردن برنامه مدیریت کنی. برای شبکه، دیتابیس، فایل و UI مدرن، این یکی از ستونهای اصلی Kotlin است.
تمرین! 🧠
دو coroutine بساز که یکی بعد از ۵۰۰ms و یکی بعد از ۱۰۰۰ms پیام چاپ کند.
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(500)
println("اولی رسید")
}
launch {
delay(1000)
println("دومی هم با تاخیر شاهانه رسید")
}
}
اولی رسید دومی هم با تاخیر شاهانه رسید