我正在制作一个(快速而又肮脏的)批处理API,该UI使UI可以发送一系列REST API调用,并一次获得所有调用的结果。

我正在使用PromiseMap对相关服务进行一些异步REST调用,这些调用随后将被收集。

可能需要运行大量线程,我想限制同时运行的线程数量,类似于Executor的线程池。

是否可以在不将线程物理地分成多个PromiseMap并将它们链接的情况下实现?我还没有发现任何在线描述限制线程池的信息。

//get requested calls
JSONArray callsToMake=request.JSON as JSONArray

//registers calls in promise map
def promiseMap = new PromiseMap()
//Can I limit this Map as a thread pool to, say, run 10 at a time until finished

data.each {
def tempVar=it
promiseMap[tempVar.id]={makeCall(tempVar.method, "${basePath}${tempVar.to}" as String, tempVar.body)}
}

def result=promiseMap.get()
def resultList=parseResults(result)
response.status=HttpStatusCodes.ACCEPTED
render resultList as JSON

我希望有一个我可能不了解的相当简单的设置。

谢谢。

最佳答案

Grails中默认的Async实现是GPars。要配置线程数,您需要使用GParsPool。看到:

http://gpars.org/guide/guide/dataParallelism.html#dataParallelism_parallelCollections_GParsPool

例:

withPool(10) {...}

10-01 20:58