Чӣ гуна бо бисёрсоҳавӣ дар Kotlin кор мекунед?
sobes.tech AI
Ҷавоб аз AI
Дар Kotlin, барои кор бо бисёрсӯроҳҳо, ман асосан корутинҳоро истифода мебарам. Онҳо роҳи сабуктар ва чандиртарро нисбат ба сӯроҳҳои анъанавӣ пешниҳод мекунанд, ки хароҷотро кам мекунанд ва идоракунии амалиёти параллелиро содда мекунанд.
Концептуалӣ асосҳои кор бо корутинҳо:
- Функсияҳои Suspend: Функсияҳое, ки метавонанд боздошта ва дубора оғоз шаванд. Онҳо асоси амалиёти асинхронӣ дар корутинҳо мебошанд.
suspend fun fetchData(): String { delay(1000) // Намунаи боздоштан return "Маълумот гирифта шуд" } - CoroutineScope: Давомнокии корутинҳоро муайян мекунад ва имкон медиҳад, ки онҳоро бекор кардан мумкин аст.
import kotlinx.coroutines.* fun main() = runBlocking { // CoroutineScope барои иҷрои бандшуда launch { // Эҷоди корутин нав дар ин Scope // Код корутин } } - Dispatchers: Гурӯҳҳои сӯроҳҳоро муайян мекунанд, ки дар онҳо корутин иҷро мешавад.
Dispatchers.Default: Барои ҳисобҳои шиддатноки CPU.Dispatchers.IO: Барои амалиёти I/O, ки монеа эҷод мекунанд (масалан, шабака, файлҳо).Dispatchers.Main: Барои кор бо UI (дар платформаҳои мувофиқ, масалан, Android).Dispatchers.Unconfined: Ба гурӯҳи махсуси сӯроҳҳо тааллуқ надорад.
import kotlinx.coroutines.* suspend fun doSomethingAsync() { withContext(Dispatchers.IO) { // гузаштан ба диспетчери I/O // иҷрои амалиёти монеа эҷодкунанда } } - Созандагони корутин (Coroutine Builders): Функсияҳо барои оғоз кардани корутин.
launch: Корутинро оғоз мекунад ваJob-ро бармегардонад, ки барои бекор кардан истифода мешавад.async: Корутинро оғоз мекунад ваDeferred-ро бармегардонад, ки имкон медиҳад натиҷаро ба даст оред (await()).
import kotlinx.coroutines.* suspend fun example() { val job = launch { // вазифаи параллел } val deferredResult = async { // вазифа, ки натиҷа медиҳад "Натиҷа" } job.cancel() // бекор кардани вазифа val result = deferredResult.await() // гирифтани натиҷа }
Барои ҳамоҳангсозии дастрасӣ ба захираҳои умумӣ, ман аз воситаҳои пакети kotlinx.coroutines.sync истифода мебарам, масалан Mutex ё Semaphore.
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.*
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock { // бастани Mutex пеш аз дастрасӣ ба захираи умумӣ
counter++
}
}
Дар баъзе ҳолатҳои махсус, вақте ки ниёз ба идоракунии мустақим дар сатҳи поёнӣ вуҷуд дорад, ман метавонем синфҳои пакети java.util.concurrent ё синфҳои мустақим Thread ва Runnable-ро истифода барам, ҳарчанд ин хеле камтар аз корутинҳо истифода мешавад.
Афзалиятҳои корутинҳо дар муқоиса бо сӯроҳҳои анъанавӣ:
| Хусусият | Корутинҳо | Сӯроҳҳои анъанавӣ |
|---|---|---|
| Вазнин | Сабуктар, бисёре дар як сӯроҳ | Вазнин, ҳар сӯроҳ захираҳоро мегирад |
| Гузариш | Ҳамкорона (suspend/resume) | Мақбур (планировщики ОС) |
| Бекор кардан | Осон ва сохторӣ | Муҳаққақ, ниёз ба идоракунии қатъҳо |
| Дебаг | Мусоид, сақланиши стеки зангҳо | Мушкилӣ метавонад бошад |
| Сохторӣ | Дастгирии рақобати сохторӣ | Камтар сохторӣ |
Ман корутинҳоро барои самаранокии онҳо, соддагии навиштани коди асинхронӣ ва хонданашон беҳтар, махсусан дар кор бо пайдарпайии мураккабии амалиётҳои асинхронӣ, афзалият медиҳам.