Middle
Какви механизми предоставя Kotlin за работа с паралелни изчисления?
sobes.tech AI
Отговор от AI
- Корутини (Coroutines): Леките потоци, които позволяват писане на асинхронен код в императивен стил, като избягват блокиращи извиквания. Основават се на възобновяеми функции и не са свързани с нативни потоци.
- Dispatchers: Определят потока или пул от потоци, в който ще се изпълнява корутината.
Dispatchers.Default: За ресурсоемки задачи (например CPU-bound).Dispatchers.IO: За операции с вход/изход (например мрежови заявки, работа с файлове).Dispatchers.Main: За изпълнение на код в главния поток (например актуализация на UI в Android приложение).Dispatchers.Unconfined: Изпълнява корутината в текущия поток до първия извик на suspend функция.
- Suspend функции: Функции, които могат да бъдат спирани и възобновени по-късно. Маркират се с модификатора
suspend. - Context: Съдържа информация за корутината, като диспетчер, job и обработчик на изключения.
- Job: Представлява жизнения цикъл на корутината (стартирана, активна, завършена, отменена). Позволява управление на корутината (отмяна, изчакване за завършване).
- Scope: Определя обхвата за корутините, управлявайки техния жизнен цикъл.
- MutableStateFlow / SharedFlow: В библиотеката
kotlinx.coroutines.flow, позволяват безопасен обмен на данни между корутините. - Mutex: Примитив за синхронизация за защита на критични секции.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Пример за използване на корутини и диспетчер
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++
}
}