Groovy PromiseMap - 我可以限制异步线程池吗?

时间:2014-06-16 18:43:05

标签: grails asynchronous groovy promise

我正在创建一个(快速且脏的)批处理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

我希望这是一个我可能不知道的相当直接的环境。

谢谢。

2 个答案:

答案 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()
}