我正在创建一个(快速且脏的)批处理API,允许UI发送一系列REST API调用并立即获取所有这些调用的结果。
我正在使用PromiseMap对相关服务进行一些异步REST调用,之后会收集这些调用。
可能需要运行大量线程,我想限制同时运行的线程数,类似于Executor的线程池。
如果没有将线程物理地分成多个PromiseMaps并将它们链接起来,这是否可行?我还没有找到任何在线描述限制线程池的内容。
//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
我希望这是一个我可能不知道的相当直接的环境。
谢谢。
答案 0 :(得分:2)
Grails中的默认Async实现是GPars。要配置使用GParsPool所需的线程数。参见:
http://gpars.org/guide/guide/dataParallelism.html#dataParallelism_parallelCollections_GParsPool
示例:
withPool(10) {...}
答案 1 :(得分:0)
withPool似乎不起作用。万一有人在限制线程的话,这就是我所做的。我们可以使用自定义ThreadPool创建一个自定义组,并指定线程数。
def customGroup = new DefaultPGroup(new DefaultPool(true, 5))
try {
Dataflow.usingGroup(customGroup, {
def promises = new PromiseList()
(1..100).each { number ->
promises << {
log.info "Performing Task ${number}"
Thread.sleep(200)
number++
}
}
def result = promises.get()
})
}
finally {
customGroup.shutdown()
}