По документам использование асинхронного или запуска на экземпляре GlobalScope
крайне нежелательно, код приложения обычно должен использовать определяемый приложением CoroutineScope
.
Если мы посмотрим наИз определения GlobalScope
мы увидим, что он объявлен как объект :
object GlobalScope : CoroutineScope { ... }
объект представляет один статический экземпляр (Singleton) .В Kotlin / JVM статическая переменная возникает, когда класс загружается JVM, и умирает, когда класс выгружается.При первом использовании GlobalScope
он будет загружен в память и будет оставаться там до тех пор, пока не произойдет одно из следующих событий:
- класс выгружен
- JVM выключается
- процесс умирает
Таким образом, он будет занимать некоторое количество памяти во время работы вашего серверного приложения.Даже если ваше серверное приложение завершено, но процесс не уничтожен, запущенная сопрограмма все еще может работать и потреблять память.
Запуск новой сопрограммы из глобальной области с помощью GlobalScope.async
или GlobalScope.launch
создастсопрограмма верхнего уровня " независимо ".
Механизм, обеспечивающий структуру сопрограмм, называется структурированный параллелизм .Давайте посмотрим, какие преимущества имеет структурированный параллелизм по сравнению с глобальными областями :
- Область действия обычно отвечает за дочерние сопрограммы, и их время жизни привязановремя жизни области.
- Область может автоматически отменять дочерние сопрограммы, если что-то идет не так или если пользователь просто передумает и решает отменить операцию.
- Область автоматически ожидает завершениявсех детских сопрограмм.Поэтому, если область соответствует сопрограмме, родительская сопрограмма не завершится, пока не будут завершены все сопрограммы, запущенные в этой области.
При использовании GlobalScope.async
нет структуры, котораясвязывает несколько сопрограмм с меньшей областью .Сопрограммы, запущенные из глобальной области 1060 *, все независимы ;срок их службы ограничен только временем жизни всего приложения.Можно сохранить ссылку на сопрограмму, запущенную из глобальной области видимости, и дождаться ее завершения или явно отменить ее, но это не произойдет автоматически, как это было бы с структурированным .Если мы хотим отменить все сопрограммы в области действия с структурированным параллелизмом , нам нужно только отменить родительскую сопрограмму, и это автоматически распространит отмену на все дочерние сопрограммы.
Если вы неНе требуется привязывать сопрограмму к определенному объекту времени жизни, и вы хотите запустить независимую сопрограмму верхнего уровня, которая работает в течение всего времени жизни приложения и не отменяется преждевременно, и вы не хотите использовать преимущества структурированный параллелизм , затем используйте global scopes .