Spring Boot Batch: пример оптимизации производительности процессора

В ответе для настройки параллельных (разбитых) шагов пакета Spring с помощью примечаний
пример (FlowJobBuilderTests.java).

Вопрос: действительно ли этот ответ подходит для оптимизации производительности? (У меня есть несколько длительных задач, потребляющих процессор, чтобы выполнить и нужно использовать доступные процессоры оптимизированным способом)

2 ответа

  1. Пример вы указываете на uses SimpleAsyncTaskExecutor .

    документация Javadoc:

    Примечание: эта реализация не использует потоки! Вместо этого рассмотрим реализацию TaskExecutor с объединением потоков, в частности, для выполнения большого числа краткосрочных задач.

    Поэтому для повышения эффективности использования ЦП я бы предпочел использовать ThreadPoolTaskExecutor или ConcurrentTaskExecutor .

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

    (Имея больший размер пула потоков, было бы подходящим для задач границ ввода-вывода, так что ЦП не ждал бы операций ввода-вывода)

    Реакция на комментарий:

    Теперь я лучше понимаю ваши опасения. Да, вы можете выполнять шаги параллельно. Вот пример из моей книги о enterprise Spring:

      @Bean
      public Job prepareTeaJob(JobBuilderFactory jobBuilderFactory,
          @Qualifier("boilWaterStep") Step boilWaterStep,
          @Qualifier("addTeaStep") Step addTeaStep,
          @Qualifier("addSugarStep") Step addSugarStep,
          @Qualifier("addWaterStep") Step addWaterStep,
          TaskExecutor customTaskExecutor) {
        Job job = jobBuilderFactory.get("prepareTeaJob")
            .start(boilWaterStep)
            .split(customTaskExecutor)
            .add(new FlowBuilder<Flow>("addIngredientsSplit")
                .from(boilWaterStep).next(addTeaStep)
                .from(boilWaterStep).next(addSugarStep)
                .end())
            .next(addWaterStep)
            .end()
            .build();
        return job;
      }
    }
    

    Из этого примера addTeaStepи addSugarStepбудет выполняться параллельно, сразу после boilWaterStep.

  2. С помощью

            Thread thread = Thread.currentThread();
            System.out.println(thread);
    

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

    Другим хорошим примером использования различных потоков является:

    https://examples.javacodegeeks.com/enterprise-java/spring/batch/spring-batch-multithreading-example / Ашраф Сархан.