Назад к вопросам
Middle
105
questionbank

Какие механизмы предоставляет Kotlin для работы с параллельными вычислениями?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  • Корутины (Coroutines): Легковесные потоки, которые позволяют писать асинхронный код в императивном стиле, избегая блокирующих вызовов. Основаны на возобновляемых функциях и не привязаны к нативным потокам.
  • Dispatchers: Определяют поток или пул потоков, в котором будет выполняться корутина.
    • Dispatchers.Default: Для ресурсоемких задач (например, CPU-bound).
    • Dispatchers.IO: Для I/O операций (например, сетевые запросы, работа с файлами).
    • 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++
    }
}