Как ограничить количество рабочих, работающих параллельно в WorkManager? - PullRequest
0 голосов
/ 05 февраля 2020

Я ставлю в очередь файлы (выбранные пользователем) для загрузки, а затем обновляю статус syn c с помощью WorkManager следующим образом:

fun schedule(files: List<String>) {
    var cont = workManager
                .beginUniqueWork(issueId, APPEND, files.map { workRequest(it) })
                .then(updateSyncStatusWork)
                .enqueue()
}

Работает хорошо. Но когда пользователь выбирает много файлов для просмотра логов, я вижу, что одновременно загружается много файлов (около 10 или даже все). И случается довольно много тайм-аутов. Я считаю, что уменьшение количества параллельных загрузок уменьшит количество тайм-аутов, но я не могу найти API в WorkManager или WorkRequest, который бы позволял это делать.

PS Я не рассматриваю их объединение в цепочку, поскольку неудачная загрузка отбрасывает загрузку. всех файлов после него.

1 Ответ

1 голос
/ 19 февраля 2020

Количество заданий, которые могут выполняться одновременно, фактически определяется настраиваемым пулом потоков. По умолчанию Executor определено здесь .

Обычно, когда вы используете базовый класс Worker, вы связываете экземпляр Worker с потоком в этом Executor. Если вы хотите лучше контролировать, с каким потоком связан ваш Worker, вы можете взглянуть на CoroutineWorker или ListenableWorker.

Количество потоков по умолчанию Executor определяется количеством ядер на устройстве. Если вы хотите, чтобы одновременно выполнялись только задания N, вы должны сделать следующее:

  • Отключить инициализатор WorkManager по умолчанию (отключив объединение манифестов для поставщика контента) .

  • Инициализируйте WorkManager на Application.onCreate() или свой собственный ContentProvider. Вы должны сделать это здесь, потому что ОС может запросить запуск запланированных Worker s. Для получения дополнительной информации посмотрите this .

val configuration = Configuration.Builder()
    // Defines a thread pool with 2 threads. 
    // This can be N (typically based on the number of cores on the device) 
    .setExecutor(Executors.newFixedThreadPool(2))
    .build()

WorkManager.initialize(context, configuration)

. В приведенном выше примере я создаю пул потоков фиксированного размера с 2 потоками (которые, в свою очередь, могут обрабатывать 2 Workers одновременно). Теперь, когда вы ставите в очередь свои Worker s, вы увидите, что только 2 из них выполняются одновременно.

...