Как предотвратить Callable от голода от длительных и тяжелых задач? - PullRequest
0 голосов
/ 21 января 2019

Мы создали приложение NLP, которое использует «тяжелые», длительные потоки извлечения информации о документе, которые используются в течение всего срока службы приложения.Результат (скажем, 20-120 небольших объектов на документ) затем помещается в очередь блокировки и индексируется в эластичный поиск другим компонентом.Поскольку экстракторам требуется около 3 минут для одного документа, индексатор большую часть времени простаивает и работает очень быстро.У нас есть n доступных процессорных ядер.

В настоящее время мы просто отправляем все (каждый вызываемый компонент) в fixedThreadPool с n+1;то есть мы настроили n извлекаемые вызовы.Это работает довольно хорошо, однако кажется, что либо один из экстракторов голодает, если мы сначала отправляем загрузчик, либо индексатор извлекает из очереди почти в самом конце срока службы приложения.

Как мы можемгарантировать, что индексатор проверяет очередь блокировки «время от времени», не допуская при этом экстракторов, чтобы максимизировать производительность приложения?

1 Ответ

0 голосов
/ 21 января 2019

Если у вас n процессоров и вы используете пул потоков с n + 1 задачами, то по крайней мере один поток будет ожидать ресурсов. Вы можете попробовать использовать пул потоков с n потоками. Что касается индексатора , который мы извлекаем из очереди в самом конце, индексированный не может извлечь из пустой очереди блокировки. Он будет ждать поступления элементов. И как только элементы станут доступны, они возьмут их из очереди

...