У нас есть код на Java с использованием ThreadPoolExecutor и CompletionService. Задачи отправляются в пул большими партиями; результаты отправляются в службу завершения, где мы собираем завершенные задачи, когда они доступны, не дожидаясь завершения всего пакета:
ThreadPoolExecutor _executorService =
new ThreadPoolExecutor(MAX_NUMBER_OF_WORKERS, new LinkedBlockingQueue(20));
CompletionService _completionService =
new ExecutorCompletionService<Callable>(_executorService)
//submit tasks
_completionService.submit( some task);
//get results
while(...){
Future result = _completionService.poll(timeout);
if(result)
//process result
}
Общее количество рабочих в пуле: MAX_NUMBER_OF_WORKERS; задачи, отправленные без доступного работника, ставятся в очередь; до 20 задач могут быть поставлены в очередь, после чего задачи отклоняются.
Каков аналог этого подхода в Gpars?
Прочитав документацию по параллелизму gpars, я нашел множество возможных вариантов: collectManyParallel()
, anyParallel()
, fork/join
и т. д., и я не уверен, какие из них даже проверить. Я надеялся найти упоминание о «завершении» или «службе завершения» в качестве сравнения в документах, но ничего не нашел. Я ищу некоторые направления/указатели о том, с чего начать, от тех, кто имеет опыт работы с gpars.