Правильный способ установки объема котлин сопрограммы для внутреннего приложения

Как правильно установить область сопрограммы -

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 ответ

Нет правильного пути, все три варианта полезны в разных сценариях.

  1. Реализация собственной области сопрограмм: если время жизни ваших сопрограмм зависит от времени жизни другого объекта. Особенно полезно в приложениях пользовательского интерфейса, например, Android, если вам нужно уничтожить все ожидающие сопрограммы, когда начальное действие уничтожено, см. Https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide- ui.md # структурированная-параллелизм-жизненный цикл-и-сопрограмма-родитель-ребенок-иерархия.
  2. Создайте область из пула потоков: если ваши сопрограммы должны работать в общем пуле потоков. В этом сценарии время жизни новой сопрограммы не зависит от этой области, но от внешней сопрограммы:

    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
        }
    }
    
  3. Использовать глобальную область: если вы хотите запустить некоторые фоновые сопрограммы, которые не зависят от какого-либо другого объекта. Как правило, лучше предоставить собственную область видимости, связанную с объектом приложения или каким-либо глобальным синглтоном. Затем вы можете предоставить свой собственный обработчик исключений и т. Д.

Для бэкэнд-сервиса я бы использовал собственный глобальный диспетчер потоков пула. Тогда у вас есть контроль над размером. Имейте в виду, что GlobalScope использует количество ЦП в качестве параметра для определения размера пула. Это отлично подходит для задач, связанных с ЦП, но не для задач ввода-вывода, таких как доступ к базе данных.

Другие вопросы по тегам