Middle
Jakie mechanizmy oferuje Kotlin do pracy z obliczeniami równoległymi?
sobes.tech AI
Odpowiedź od AI
- Koruzy (Coroutines): Lekkie wątki, które pozwalają pisać kod asynchroniczny w stylu imperatywnym, unikając wywołań blokujących. Oparte na funkcjach wznawialnych i nie są powiązane z natywnymi wątkami.
- Dispatchers: Określają wątek lub pulę wątków, na którym będzie wykonywana korutyna.
Dispatchers.Default: Dla zadań zasobożernych (np. CPU-bound).Dispatchers.IO: Dla operacji wejścia/wyjścia (np. żądania sieciowe, praca z plikami).Dispatchers.Main: Do wykonywania kodu na głównym wątku (np. aktualizacja UI w aplikacji Android).Dispatchers.Unconfined: Wykonuje korutynę na bieżącym wątku do pierwszego wywołania funkcji suspend.
- Funkcje suspend: Funkcje, które można zawiesić i wznowić później. Oznaczone modyfikatorem
suspend. - Context: Zawiera informacje o korutynie, takie jak dispatcher, job i obsługiwacz wyjątków.
- Job: Reprezentuje cykl życia korutyny (uruchomiona, aktywna, zakończona, anulowana). Pozwala zarządzać korutyną (anulować, czekać na zakończenie).
- Scope: Określa zakres dla korutyn, zarządzając ich cyklem życia.
- MutableStateFlow / SharedFlow: W bibliotece
kotlinx.coroutines.flow, umożliwiają bezpieczną wymianę danych między korutynami. - Mutex: Prymityw synchronizacji do ochrony sekcji krytycznych.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Przykład użycia korutyn i dispatcher
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Robocza korutyna: $i")
delay(100) // Nieblokujące opóźnienie
}
}
println("Uruchomiono korutynę")
job.join() // Czekanie na zakończenie korutyny
println("Korutyna zakończona")
}
// Przykład funkcji suspend
suspend fun fetchData(): String {
delay(1000) // Symulacja żądania sieciowego
return "Dane odebrane"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}