Отменится ли корутина в GlobalScope при вызове cancel() у родительского скоупа?

Что будет с корутиной в GlobalScope после cancel() родительского скоупа? Корутинa в GlobalScope — выполняется вне иерархии скоупов GlobalScope не зависит от родительских скоупов Вызов cancel() у родителя не оказывает…

Короткий ответ

Что ответить на собеседовании

Что будет с корутиной в GlobalScope после cancel() родительского скоупа? Корутинa в GlobalScope — выполняется вне иерархии скоупов GlobalScope не зависит от родительских скоупов Вызов cancel() у родителя не оказывает влияния на неё для остановки необходим явный вызов 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 может быть удобен для разовых фоновых задач, однако чаще считается антипаттерном: он способен привести к утечкам памяти или неконтролируемому выполнению, особенно если пользовательские действия отменяются.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку