我正在制作一个(快速而又肮脏的)批处理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) {...}