Что будет с корутиной в GlobalScope после cancel() родительского скоупа? Корутинa в GlobalScope — выполняется вне иерархии скоупов GlobalScope не зависит от родительских скоупов Вызов cancel() у родителя не оказывает влияния на неё для остановки необходим явный вызов cancel() при ненадлежащем управлении может стать причиной утечек ресурсов подходит для долгоживущих и фоновых задач цель: предотвратить случайное прерывание при отмене локальных скоупов
Отменится ли корутина в GlobalScope при вызове cancel() у родительского скоупа?
Что будет с корутиной в GlobalScope после cancel() родительского скоупа? Корутинa в GlobalScope — выполняется вне иерархии скоупов GlobalScope не зависит от родительских скоупов Вызов cancel() у родителя не оказывает…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Что будет с корутиной в GlobalScope после cancel() родительского скоупа?
- Корутинa в GlobalScope — выполняется вне иерархии скоупов
- GlobalScope не зависит от родительских скоупов
- Вызов cancel() у родителя не оказывает влияния на неё
- для остановки необходим явный вызов cancel()
- при ненадлежащем управлении может стать причиной утечек ресурсов
- подходит для долгоживущих и фоновых задач
- цель: предотвратить случайное прерывание при отмене локальных скоупов
Итог: отмена родительского скоупа через cancel() не остановит корутину GlobalScope — она продолжит выполнение, пока её не отменят явно.
Подробный ответ
Основной ответ
Когда корутина запускается в GlobalScope, вызов cancel() у её родительского скоупа не прерывает её работу. Причина в том, что корутины из GlobalScope не наследуют общий контекст родительского скоупа и не привязаны к жизненному циклу остальных скоупов. Иными словами, корутина в GlobalScope функционирует самостоятельно, поэтому отмена внешнего скоупа на неё не распространяется.
Ключевые моменты
- GlobalScope запускает корутины с глобальной областью видимости: они продолжают существовать, пока работает приложение, и не отменяются каскадно.
- В иерархических скоупах, например в
CoroutineScopeвнутри viewModel или activity, отмена родителя распространяется на дочерние корутины. В GlobalScope такой связи между скоупами нет. - GlobalScope стоит применять только к корутинам, которым требуется длительная и независимая работа. При этом отсутствие контроля над жизненным циклом требует особенно осторожного использования.
Практический контекст
В Android-приложениях корутины обычно запускают через viewModelScope или lifecycleScope, поскольку они связаны с жизненным циклом UI-компонентов. GlobalScope может быть удобен для разовых фоновых задач, однако чаще считается антипаттерном: он способен привести к утечкам памяти или неконтролируемому выполнению, особенно если пользовательские действия отменяются.