Использование java fork-join executor для доступа к БД

ForkJoinTask явно вызывает "Подразделяемые задачи также не должны выполнять блокирующий ввод / вывод". Его основная цель - "вычислительные задачи, вычисляющие чистые функции или работающие на чисто изолированных объектах". Мой вопрос:

  1. Зачем разрабатывать ForkJoinTask для ограничения блокирующих задач ввода-вывода?
  2. Что за ошибки, если я реализую блокирующую задачу ввода-вывода?
  3. Как получается, что как в Spring, так и в Play Framework ах полно примеров использования исполнителей fork-join для вызовов БД?

В моем сценарии один запрос выполняет два типа работ, один из которых - шифрование, которое увеличивает нагрузку на ядро ​​ЦП до 100% за 200 мс, а второй - несколько вызовов базы данных. Любой вид статического разбиения, такой как 6 потоков для шифрования и 2 потока для блокировки ввода-вывода, не обеспечит оптимальное использование процессора. Следовательно, наличие исполнителя fork-join с определенным уровнем избыточного количества потоков по сравнению с общим числом процессоров в сочетании с кражей работы обеспечит лучшее использование ресурсов процессора.

Верно ли мое предположение и понимание в отношении исполнителя forkjoin, и если нет, то, пожалуйста, укажите мне на пробел.

2 ответа

Зачем разрабатывать ForkJoinTask для ограничения блокирующих задач ввода-вывода?

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

Что за ошибки, если я реализую блокирующую задачу ввода-вывода?

Как правило, FJPool выделяет поток о количестве процессоров. так что если вам нужно использовать IO блокируя потоки, убедитесь, что вы выделяете достаточно потоков для других ваших задач.

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

Как получается, что как в Spring, так и в Play Framework ах полно примеров использования исполнителей fork-join для вызовов БД?

play ничем не отличается. они используют посвященный pools для задачи ввода-вывода, поэтому другая задача не пострадает.

Framework не ограничивает какой-либо тип обработки. Не рекомендуется делать блокировку и т. Д. Я написал критику об этой структуре много лет назад, вот точка в рекомендациях. Это было для версии Java7, но все еще применимо для Java8.

Блокировка не смертельна, спринт и блок игры, и они работают просто отлично. Вы должны быть осторожны при использовании Java8, так как по умолчанию есть общий пул / объединение пулов, и связывание потоков может иметь последствия для других пользователей. Вы всегда можете определить свой собственный п / ф пул с дополнительными накладными расходами, но по крайней мере вы не будете мешать другим, используя общий пул.

Ваш сценарий не выглядит плохо. Вы не ждете ответов из Интернета. Попробуйте. Если вы столкнулись с трудностями с остановкой потоков, загляните в интерфейс ForkJoinPool.ManagedBlocker. Использование этого интерфейса информирует п / ж пул о том, что вы выполняете блокировку вызовов, и платформа создаст компенсационные потоки.

Другие вопросы по тегам