Диспетчер сопрограмм Kotlin, как по умолчанию, но без основного (пользовательского) потока

Есть ли способ создать (или получить каким-либо образом) диспетчер сопрограмм Kotlin на Android, который действует как Default, но исключает касание ядер потоков пользовательского интерфейса?

Итак, в основном, я сталкиваюсь с тяжелыми вычислительными задачами, которые я хочу обрабатывать с использованием как можно большего количества ресурсов ЦП, чтобы они не влияли на производительность пользовательского интерфейса.

С Dispatchers.Default я получаю от системы больше всего ресурсов, но в то же время мой пользовательский интерфейс становится медленнее.

Какие лучшие практики можно здесь применить?


person MikhailKrishtop    schedule 12.04.2019    source источник
comment
Вместо Dispatcher вы можете использовать Executers для предоставления ThreadPools.   -  person Jeel Vankhede    schedule 12.04.2019
comment
Как я могу заставить ThreadPools касаться только ядер ЦП без пользовательского интерфейса?   -  person MikhailKrishtop    schedule 12.04.2019
comment
Проверьте это руководство: medium.com/capital-one-tech/   -  person Jeel Vankhede    schedule 12.04.2019
comment
Dispatchers.Default не касается потока пользовательского интерфейса. Ваш пользовательский интерфейс отстает, потому что вы используете 100% ЦП. Использование другого пула потоков не изменит ситуацию. Нет такой вещи, как ядро ​​потока пользовательского интерфейса.   -  person Marko Topolnik    schedule 12.04.2019
comment
В общем, вы говорите, что нет способа сделать плавный UI + анимацию, если вы занимаетесь тяжелой работой? И я не могу исключить ядро, отвечающее за UI?   -  person MikhailKrishtop    schedule 12.04.2019
comment
Нет, нельзя исключить ядро.   -  person Derek K    schedule 12.04.2019
comment
Попробуйте использовать пул размером (coreCount - 1).   -  person Marko Topolnik    schedule 12.04.2019


Ответы (2)


Оказывается, решение моих проблем было не в области JVM, а в NDK. Собственные библиотеки загружали ЦП на 100%, и в основном похоже, что я ничего не могу с этим поделать с Java / Kotlin. Похоже, ответ находится где-то в коде C, что не в моей компетенции.

Также я должен упомянуть Executors.newFixedThreadPool((Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1)).asCoroutineDispatcher() решение. Мне кажется, что это может быть полезно для кого-то, у кого есть проблема с аналогичной проблемой.

person MikhailKrishtop    schedule 15.04.2019

Вы можете использовать диспетчер с настраиваемым пулом потоков следующим образом:

val threads = 4
val dispatcher = Executors.newFixedThreadPool(threads).asCoroutineDispatcher()
person Derek K    schedule 12.04.2019
comment
вы можете использовать фабрику потоков, которая создает потоки с фоновым приоритетом. - person Vairavan; 13.04.2019
comment
Как только вы примете, что в Android нет такой вещи, как ядро ​​потока пользовательского интерфейса, вы сможете лучше рассмотреть решения, которые приведут к благоприятным результатам. - person Marko Topolnik; 15.04.2019