Middle
როგორ აკვირდება scope კორუტინის გაუქმებას?
sobes.tech AI
პასუხი AI-სგან
Scope корутинаны Job объекты ярдәмендә күзәтә. Һәр CoroutineScope белән бәйле Job бар.
Яңа корутинаны CoroutineScope эчендә булдырганда, ул бу scope-тан Job ала һәм аны ата-энесенең Job итеп куллана.
Күзәтү механизмы түбәндәгечә эшли:
- Scope-ның бетерелүе: Әгәр
Jobscope-даcancel()чакырылса, ул рекурсив рәвештә барлык балаларыJob-ларын бетерә. - Балалар корутинаның бетерелүе: Балалар корутинаны (мәсәлән,
withContext(NonCancellable)аша) бетерү яки эшләмәгән исключение килеп чыкса, ул үзенең ата-энесенеңJob-ына хәбәр итә. Ата-энеJob(scope) үз чиратында башка балаларыныңJob-ларын бетерә ала. - Кооператив бетерү: Корутиналар кооператив булырга тиеш. Бу аларның бетерелүенә карата, корутинаның эчендә кодны даими рәвештә тикшереп торырга тиеш дигәнне аңлата. Стандарт
suspendфункцияләре (мәсәлән,delay, I/O операцияләре) автомат рәвештәJobхәлен тикшерә.
Код isActive яки ensureActive() белән ачык рәвештә тикшерә ала:
// Корутинаның активлыгын тикшерү мисалы
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Озын операцияне башкарабыз
delay(100) // suspend ноктасы - автомат рәвештә бетерүне тикшерә
// Яки ачык рәвештә тикшерәбез
if (!isActive) {
break // бетерү вакытында циклдан чыгу
}
}
println("fetchData корутинаны тәмамлады")
}
}
ensureActive() куллану CancellationException чыгара:
// `ensureActive()` куллану
suspend fun processData() {
// ... эш ...
ensureActive() // Әгәр корутин бетерелгән булса, `CancellationException` чыгара
// ... эшне дәвам итү, әгәр актив булса ...
}
CancellationException — бу бетерү сигналын таратуның стандарт ысулы. Аны бетерү корутиналарда хата итеп карарга ярамый.
Scope, Job иясе буларак, "ата-эне-ул" Job иерархиясен булдыра, ул атадан балаларга бетерү сигналын тарату мөмкинлеген бирә. Бу корутиннарда структуралы параллелизмнең нигезе булып тора.