Korutinlerde işbirlikçi çoklu görev nasıl mekanizmalarla gerçekleştirilir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Koritinlerde kooperatif çoklu görev, aşağıdaki mekanizmalarla gerçekleştirilir:
-
Askıya Alma Noktaları: Koroutine, belirli noktalarda (askıya alma noktaları) "askıya alınabilir" ve bu, akışı engellemeden gerçekleşir. Bu,
suspendfonksiyonlarının çağrılmasıyla olur. Askıya alma sırasında, koroutine'nin çalıştığı thread diğer görevleri yerine getirmek üzere serbest kalır. -
Dispatchers: Koroutinler,
Dispatcherskullanarak çalıştırılacak thread havuzunu belirler. Bir koroutine, bir thread üzerinde askıya alınabilir ve başka bir thread üzerinde devam ettirilebilir. -
Continuation: Her askıya alma durumunda, o anda koroutine'nin durumunu tutan bir
Continuationnesnesi oluşturulur. Koroutine devam ettirildiğinde, bu nesne kullanılarak durumu geri yüklenir ve askıya alındığı yerden devam eder. -
İşbirliği: Geliştirici, kodda açıkça
suspendnoktalarını belirtir. Bu, çoklu görevi "işbirlikçi" hale getirir – koroutine, belirli noktalarda başka bir koroutine veya göreve kontrolü gönüllü olarak devreder, işletim sistemi tarafından zorla kesilmek yerine. -
Yapısal Eşzamanlılık: Koroutinler, belirli bir kapsam (
CoroutineScope) ile ilişkilidir. Bu, bir grup koroutine'nin aynı anda iptal edilmesine olanak tanır ve tüm alt koroutinlerin ebeveyn kapsamı sona erdiğinde tamamlanmasını sağlar.
// Askıya alma noktası oluşturan suspend fonksiyon örneği
suspend fun fetchDataFromNetwork(): String {
// Ağ isteği simülasyonu
delay(1000) // Bu bir suspend fonksiyon - askıya alma noktasıdır
return "Veriler alındı"
}
fun main() = runBlocking {
// runBlocking, bir CoroutineScope oluşturur ve koroutine tamamlanana kadar mevcut thread'i engeller
println("Başlangıç")
launch {
// Başka bir thread'de (veya aynı, dispatcher'a bağlı olarak) koroutine başlatır
val data = fetchDataFromNetwork() // Burada koroutine askıya alınabilir
println("Alınan: $data")
}
println("Son (ana thread fetchDataFromNetwork tarafından engellenmiyor)")
// Ana thread, fetchDataFromNetwork beklerken diğer görevleri yapabilir
}