Подтвердить что ты не робот

В чем разница между corePoolSize и maxPoolSize в Spring ThreadPoolTaskExecutor

Мне нужно отправить massEmails всем пользователям веб-сайта. Я хочу использовать пул потоков для каждого отправленного сообщения. В настоящее время я установил значения:

<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />

В чем разница между ними и будет ли она масштабироваться. В настоящее время у меня ок. 10000 пользователей.

4b9b3361

Ответ 1

Javadoc говорит, что это лучше:

Когда новый задача представляется [...], и менее чем corePoolSize потоков выполняется новый поток, созданный для обрабатывать запрос, даже если другие рабочие потоки простаивают. Если есть более чем corePoolSize, но меньше maximumPoolSize поток работает, a новый поток будет создан только в том случае, если очередь заполнена. Установив corePoolSize и maximumPoolSizeто же самое, вы создаете фиксированный размер пул потоков. Установив maximumPoolSize по существу неограниченное значение, такое как Integer.MAX_VALUE, вы разрешаете пул для количество одновременных задач.

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

Ответ 2

Вот правила Sun для создания потоков в простых терминах:

  1. Если число потоков меньше, чем corePoolSize, создайте новый corePoolSize, чтобы запустить новую задачу.
  2. Если количество потоков равно (или больше) corePoolSize, поместите задачу в очередь.
  3. Если очередь заполнена, а число потоков меньше, чем maxPoolSize, создайте новый поток для запуска задач.
  4. Если очередь заполнена, а число потоков больше или равно maxPoolSize, отклоните задачу.

Полная статья

Происхождение ответа

Ответ 3

corePoolSize - минимальное количество потоков, используемых пулом. Число может увеличиться до maxPoolSize. Когда загрузка снизится, пул вернется к corePoolSize.

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

Ответ 4

Вам следует подумать об увеличении значения queueCapacity, чем рассмотреть возможность увеличения значения corePoolSize или maxPoolSize. Эти два свойства (* PoolSize) - это количество пулов, которые будут выполняться, но каждое сообщение будет рассмотрено в queueCapacity

<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="1000" />
<property name="waitForTasksToCompleteOnShutdown" value="true"/>

Если у вас есть 10000 пользователей для отправки 1000 * 10 (maxPoolSize) = 10000, но если 1000 для каждого потока тяжелый, мы можем рассмотреть возможность увеличения poolSize.

Ответ 5

То, что все так ясно объяснили, правильно. Несколько вещей, на которые следует обратить внимание, это то, что у вас всегда должен быть ограниченный размер как для основного пула, так и для очереди. Если размер базового пула очень велик, велика вероятность того, что многие ваши потоки из пула не будут использоваться в течение определенного периода времени, поскольку для каждого запроса создается новый поток, пока он не достигнет максимального размера пула

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

Если размер вашего компьютера в 1 ГБ и емкость очереди равны Integer.MAX_VALUE, то существует высокая вероятность того, что ваша машина в какой-то момент времени начнет отклонять запрос из-за OutOfMemory, который вы можете отслеживать в любом инструменте JVM GUI.