Лучше ли использовать несколько рабочих, которые выполняют одну и ту же задачу для входных данных, или одного рабочего, который выполняет задачу несколько раз для входных данных?

#android #android-workmanager

#Android #android-workmanager

Вопрос:

Лучше ли использовать несколько рабочих, которые выполняют одну и ту же задачу для входных данных, или одного рабочего, который выполняет задачу несколько раз для входных данных?

1 рабочий :

 \ SomeWorker.class
    @NonNull
    @Override
    public Worker.Result doWork() {
        Context applicationContext = getApplicationContext();
        boolean success = Boolean.TRUE;
        List<String> resourceUris = new ArrayList<String>(has a list of strings);

        for (String resourceUri : resourceUris) {
            success = doSomething(resourceUri);
        }

        return success ? Result.success() : Result.retry();
    }

\ Viewmodel.class

OneTimeWorkRequest save = new OneTimeWorkRequest.Builder(SomeWorker.class)
                .addTag(TAG_OUTPUT)
                .build();
workManager.beginUniqueWork(save).enqueue();
 

Против

Несколько рабочих, которые выполняют одну задачу независимо :

 \ Someworker.class
    @NonNull
    @Override
    public Worker.Result doWork() {
        Context applicationContext = getApplicationContext();
        String resourceUri = getInputData().getString("RESOURCE_URI");
        return doSomething(resourceUri) ? Result.success() : Result.retry();
    }


\ Viewmodel.class

List<String> resourceUris = new ArrayList<String>(has a list of strings);
List<OneTimeWorkRequest.Builder> someBuilder;
for (int i = 0; i < resourceUris.size(); i  ) {
           someBuilder.add( new OneTimeWorkRequest.Builder(Someworker.class));
}

workManager.beginUniqueWork(someBuilder).enqueue();
 

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

Ответ №1:

Это зависит.

Я бы сказал, используйте один Worker , если вы не знаете, что можете запустить окно 10 минутного выполнения, или если вы знаете, что есть части Worker , которые полезны независимо (т. Е. Повторно Используются из других частей приложения).

Комментарии:

1. Но можете ли вы распределить задачу внутри одного рабочего для параллельного выполнения или вам придется развернуть несколько для достижения этой цели.

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