Правильный способ установки объема котлин сопрограммы для внутреннего приложения
Как правильно установить область сопрограммы -
1. реализация объема
@Service
class MyServiceImpl : MyService, CoroutineScope {
private val job: Job = Job()
override val coroutineContext: CoroutineContext
get() = job + Executors.newFixedThreadPool(100).asCoroutineDispatcher()
override fun get(): String {
launch {....}
return "Result"
}}
` 2. Без реализации
@Service
class MyServiceImpl : MyService {
private val scope = Executors.newFixedThreadPool(100).asCoroutineDispatcher()
override fun get(): String {
GlobalScope.launch(scope) {....}
return "Result"
}}
Или просто использовать GlobalScope без какого-либо контекста??
1 ответ
Нет правильного пути, все три варианта полезны в разных сценариях.
- Реализация собственной области сопрограмм: если время жизни ваших сопрограмм зависит от времени жизни другого объекта. Особенно полезно в приложениях пользовательского интерфейса, например, Android, если вам нужно уничтожить все ожидающие сопрограммы, когда начальное действие уничтожено, см. Https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide- ui.md # структурированная-параллелизм-жизненный цикл-и-сопрограмма-родитель-ребенок-иерархия.
Создайте область из пула потоков: если ваши сопрограммы должны работать в общем пуле потоков. В этом сценарии время жизни новой сопрограммы не зависит от этой области, но от внешней сопрограммы:
val fixedThreadPoolContext = newFixedThreadPoolContext(100, "background") launch(Dispatchers.Main) { withContext(fixedThreadPoolContext) { //parent job is from the outer coroutine } //or val asyncResult = async(fixedThreadPoolContext) { //parent job is from the outer coroutine } }
Использовать глобальную область: если вы хотите запустить некоторые фоновые сопрограммы, которые не зависят от какого-либо другого объекта. Как правило, лучше предоставить собственную область видимости, связанную с объектом приложения или каким-либо глобальным синглтоном. Затем вы можете предоставить свой собственный обработчик исключений и т. Д.
Для бэкэнд-сервиса я бы использовал собственный глобальный диспетчер потоков пула. Тогда у вас есть контроль над размером. Имейте в виду, что GlobalScope использует количество ЦП в качестве параметра для определения размера пула. Это отлично подходит для задач, связанных с ЦП, но не для задач ввода-вывода, таких как доступ к базе данных.