Sobes.tech
Middle

როგორ აკვირდება scope კორუტინის გაუქმებას?

sobes.tech AI

პასუხი AI-სგან

Scope корутинаны Job объекты ярдәмендә күзәтә. Һәр CoroutineScope белән бәйле Job бар.

Яңа корутинаны CoroutineScope эчендә булдырганда, ул бу scope-тан Job ала һәм аны ата-энесенең Job итеп куллана.

Күзәтү механизмы түбәндәгечә эшли:

  1. Scope-ның бетерелүе: Әгәр Job scope-да cancel() чакырылса, ул рекурсив рәвештә барлык балалары Job-ларын бетерә.
  2. Балалар корутинаның бетерелүе: Балалар корутинаны (мәсәлән, withContext(NonCancellable) аша) бетерү яки эшләмәгән исключение килеп чыкса, ул үзенең ата-энесенең Job-ына хәбәр итә. Ата-эне Job (scope) үз чиратында башка балаларының Job-ларын бетерә ала.
  3. Кооператив бетерү: Корутиналар кооператив булырга тиеш. Бу аларның бетерелүенә карата, корутинаның эчендә кодны даими рәвештә тикшереп торырга тиеш дигәнне аңлата. Стандарт 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 иерархиясен булдыра, ул атадан балаларга бетерү сигналын тарату мөмкинлеген бирә. Бу корутиннарда структуралы параллелизмнең нигезе булып тора.