Использование java fork-join executor для доступа к БД
ForkJoinTask явно вызывает "Подразделяемые задачи также не должны выполнять блокирующий ввод / вывод". Его основная цель - "вычислительные задачи, вычисляющие чистые функции или работающие на чисто изолированных объектах". Мой вопрос:
- Зачем разрабатывать ForkJoinTask для ограничения блокирующих задач ввода-вывода?
- Что за ошибки, если я реализую блокирующую задачу ввода-вывода?
- Как получается, что как в 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. Использование этого интерфейса информирует п / ж пул о том, что вы выполняете блокировку вызовов, и платформа создаст компенсационные потоки.