Как увеличить размер Котлин сопрограммы Dispatchers.IO на Android? - PullRequest
2 голосов
/ 21 октября 2019

Сопрограммы Dispatchers.IO контекст ограничен 64 потоками. Этого недостаточно для надежного взаимодействия с блокирующим кодом в высококонкурентной системе.

В документации указано , что:

Дополнительные потоки в этом пуле созданы и отключеныпо запросу, по требованию. Количество потоков, используемых этим диспетчером, ограничено значением системного свойства «kotlinx.coroutines.io.parallelism» (IO_PARALLELISM_PROPERTY_NAME). По умолчанию используется ограничение в 64 потока или количество ядер (в зависимости от того, какое из них больше).

Я хочу изменить системное свойство kotlinx.coroutines.io.parallelism на другое. Однако, если я просто сделаю это:

adb shell "setprop kotlinx.coroutines.io.parallelism 1000"

, я получу следующий результат:

setprop: failed to set property 'kotlinx.coroutines.io.parallelism' to '1000'

Кроме того, если я хочу отправить свое приложение, мне нужно будет изменитьэто свойство на устройствах пользователей, не так ли? В противном случае приложение не будет работать. Однако, даже если предположить, что это возможно, насколько я понимаю, все приложения, которые изменяют это свойство, будут переопределять настройки друг для друга. Это не похоже на надежный режим работы.

Итак, у меня есть три вопроса в этом контексте:

  1. Является ли свойство, подразумеваемое в документации, действительно "системным свойством"что я пытался изменить?
  2. Как изменить это свойство на устройстве без прав доступа для всех пользователей моего приложения?
  3. Есть ли лучшая альтернатива?

PSЯ знаю, что если бы я использовал только сопрограммы, без блокировки кода, это не было бы проблемой (вероятно). Но давайте просто предположим, что мне нужно использовать блокирующие вызовы (например, устаревший код Java).

Ответы [ 2 ]

4 голосов
/ 21 октября 2019

IO_PARALLELISM_PROPERTY_NAME относится не к системному свойству Android , а к системному свойству Java . Просто добавьте этот код в начале вашего приложения, например, сначала в Application.onCreate(), чтобы изменить его на 1000:

import static kotlinx.coroutines.DispatchersKt.IO_PARALLELISM_PROPERTY_NAME;

System.setProperty(IO_PARALLELISM_PROPERTY_NAME, Integer.toString(1000));

Это не должно быть сделано за-устройство основы с рутом или что-то в этом роде. Он будет работать везде, так как это обычный код приложения, использующий обычные API приложения.

Пока вы делаете это до того, как впервые используете Dispatchers.IO, изменение вашего свойства будет применено.

4 голосов
/ 21 октября 2019

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

val dispatcher = Executors.newFixedThreadPool(128).asCoroutineDispatcher()
...