Groovy параллелизм: лучший способ семантически агрегировать результаты? - PullRequest
3 голосов
/ 18 мая 2010

Мне нужно вызвать несколько методов параллельно и ждать результатов. Каждый полагается на разные ресурсы, поэтому они могут вернуться в разное время. Мне нужно подождать, пока я получу все результаты или тайм-аут после определенного периода времени.

Я мог бы просто создавать потоки со ссылкой на общий объект с помощью вызова метода, но есть ли лучший, более интересный способ сделать это?

Текущая реализация:

        Executors exec = Executors.newFixedThreadPool(10);

        for (obj in objects) {
            def method = {
                def result = new ResultObject(a: obj, b: obj.callSomeMethod())
                result
            } as Callable<ResultObject>

            callables << method
        }

        List<Future<ResultObject>> results = exec.invokeAll(callables)

        for (result in results) {
            try{
                 def searchResult = result.get()
                 println 'result retrieved'
            }  catch (Exception e)
            {
                println 'exception'
                e.printStackTrace()
            }
        }
}

Ответы [ 2 ]

6 голосов
/ 18 мая 2010

Решение Groovier заключается в использовании GPars - библиотеки параллелизма, написанной на Groovy.

import static groovyx.gpars.GParsExecutorsPool.withPool

withPool {
    def callable = {obj -> new ResultObject(a: obj, b: obj.callSomeMethod())}.async()
    List<ResultObject> results = objects.collect(callable)*.get()
}
2 голосов
/ 18 мая 2010

AbstractExecutorService.invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)

В шпунтовой части будут использоваться крышки as Callable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...