Middle
Котлин барои кор бо ҳисобҳои параллелӣ кадом механизмҳоро пешниҳод мекунад?
sobes.tech AI
Ҷавоб аз AI
- Կորուտիններ (Coroutines): Հ Lightweight հոսքեր, որոնք թույլ են տալիս գրել ասինխրոնային կոդը իմպերատիվ ոճով, խուսափելով բլոկավորող կանչերից։ Հիմնված են վերականգնվող ֆունկցիաների վրա և չեն կապված բնիկ հոսքերի հետ:
- Dispatchers: Հորոշում է հոսքը կամ հոսքերի փուլը, որտեղ կիրականացվի կորուտինը:
Dispatchers.Default: Հիմնականում ռեսուրսային ծանր առաջադրանքների համար (օրինակ, CPU-կենտրոնացված)Dispatchers.IO: I/O գործողությունների համար (օրինակ, ցանցային հարցումներ, ֆայլերի աշխատանք)Dispatchers.Main: Կորուտինի կատարման համար գլխավոր հոսքում (օրինակ, UI-ի թարմացում Android հավելվածում)Dispatchers.Unconfined: Կորուտինը կատարում է ներկայիս հոսքում մինչև առաջին suspend-ֆունկցիայի կանչը
- Suspend-ֆունկցիաներ: Ֆունկցիաներ, որոնք կարող են դադարեցվել և վերականգնվել ուշացումով։ Սահմանվում են
suspendմոդիֆիկատորով: - Context: պարունակում է կորուտինի մասին տեղեկություններ, ինչպիսիք են dispatcher-ը, job-ը և արտառոց դեպքերի մշակողը
- Job: ներկայացնում է կորուտինի կյանքի ցիկլը (սկսված, ակտիվ, ավարտված, չեղարկված): Позволяет управлять կորուտինով (չեղարկել, սպասել ավարտին)
- Scope: սահմանում է կորուտինների տեսանելիության տարածքը, կառավարելով նրանց կյանքի ցիկլը
- MutableStateFlow / SharedFlow:
kotlinx.coroutines.flowգրադարանում, թույլ է տալիս անվտանգ փոխանակել տվյալներ կորուտինների միջև - Mutex: սինխրոնիզացիայի primitive, որը պաշտպանում է կրիտիկական հատվածները
import kotlinx.coroutines.*
fun main() = runBlocking {
// Կորուտինների և dispatcher-ի օգտագործման օրինակ
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Աշխատող կորուտին: $i")
delay(100) // Բլոկավորող չլինող հետաձգում
}
}
println("Կորուտին սկսվեց")
job.join() // Կապվում ենք կորուտինի ավարտին
println("Կորուտին ավարտվեց")
}
// Suspend-ֆունկցիայի օրինակ
suspend fun fetchData(): String {
delay(1000) // Ցանցային հարցման իմիտացիա
return "Տվյալները ստացվեցին"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}