Количество/макс. одновременных заданий в Android WorkManager

Есть ли в WorkManager ограничение на количество заданий, которые выполняются одновременно?

Очень простой пример:

  • Нажмите кнопку, создав 10 разовых заданий
  • Поставить их всех в очередь
  • 3 задания выполняются одновременно, вместо всех 10, как ожидалось

class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        queue.setOnClickListener {
            val jobs = mutableListOf<OneTimeWorkRequest>()

            for( i in 1..10 ) {
                jobs += OneTimeWorkRequestBuilder<MyWorker>()
                    .setInputData(workDataOf("key" to i))
                    .build()
            }

            WorkManager.getInstance().enqueue(jobs)
        }
    }
}

class MyWorker: Worker() {
    override fun doWork(): Result {
        val jobId = inputData.getInt("key", -1)

        Log.d("worker", "starting job: $jobId")

        Completable.timer(10, SECONDS).blockingGet()

        Log.d("worker", "job finished: $jobId")

        return SUCCESS
    }
}

И вывод:

08-30 14:03:10.392  9825  9855 D worker  : starting job: 2
08-30 14:03:10.396  9825  9856 D worker  : starting job: 3
08-30 14:03:10.400  9825  9854 D worker  : starting job: 1
08-30 14:03:20.421  9825  9855 D worker  : job finished: 2
08-30 14:03:20.421  9825  9856 D worker  : job finished: 3
08-30 14:03:20.421  9825  9854 D worker  : job finished: 1
08-30 14:03:20.442  9825  9856 D worker  : starting job: 4
08-30 14:03:20.448  9825  9854 D worker  : starting job: 5
08-30 14:03:20.450  9825  9855 D worker  : starting job: 6
08-30 14:03:30.444  9825  9856 D worker  : job finished: 4
08-30 14:03:30.449  9825  9854 D worker  : job finished: 5
08-30 14:03:30.451  9825  9855 D worker  : job finished: 6
08-30 14:03:30.474  9825  9856 D worker  : starting job: 7
08-30 14:03:30.477  9825  9855 D worker  : starting job: 8
08-30 14:03:30.480  9825  9854 D worker  : starting job: 9
08-30 14:03:40.476  9825  9856 D worker  : job finished: 7
08-30 14:03:40.478  9825  9855 D worker  : job finished: 8
08-30 14:03:40.481  9825  9854 D worker  : job finished: 9
08-30 14:03:40.497  9825  9856 D worker  : starting job: 10
08-30 14:03:50.500  9825  9856 D worker  : job finished: 10

person Jamie Dulaney    schedule 30.08.2018    source источник
comment
у вас есть какие-либо обновления по этому поводу?   -  person Gowtham Gopalakrishnan    schedule 15.01.2019
comment
Нет, я не получал никаких обновлений по этому поводу   -  person Jamie Dulaney    schedule 16.01.2019


Ответы (1)


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

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

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

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

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

val configuration = Configuration.Builder()
    // Defines a thread pool with 10 threads. 
    // Ideally you would choose a number that is dynamic based on the number 
    // of cores on the device.
    .setExecutor(Executors.newFixedThreadPool(10))
    .build()

WorkManager.initialize(context, configuration)

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

person Rahul    schedule 23.01.2019
comment
Ограничивающим фактором, который следует учитывать для количества работников, является наличие зависимостей между работниками. Вы получите IllegalStateException Данные не могут занимать более 10240 байт при сериализации, если у вас есть WorkerB, который зависит от 1000 WorkerA, которые передают некоторый минимальный объем данных. - person Brendan Weinstein; 12.06.2019
comment
Хотя это звучит логично, в моем случае я установил однопоточный исполнитель. Но он по-прежнему запускает doWork нескольких рабочих процессов одновременно. Конфигурация правильная, я убедился, что она вызывается. Просто сейчас в полном замешательстве... - person hannojg; 27.02.2021