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

Grails Groovy PromiseMap-我可以限制异步线程池吗?,grails,asynchronous,groovy,promise,Grails,Asynchronous,Groovy,Promise,我正在制作一个(快速而肮脏的)批处理API,它允许UI发送一系列REST API调用,并一次获得所有调用的结果 我正在使用PromiseMap对相关服务进行一些异步REST调用,这些调用随后被收集 可能需要运行大量线程,我想限制同时运行的线程数量,类似于Executor的线程池 //get requested calls JSONArray callsToMake=request.JSON as JSONArray //registers calls in promise map def p

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

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

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

//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
在不将线程物理分离为多个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中默认的异步实现是GPAR。要配置线程数,需要使用GParsPool。见:

例如:

withPool(10) {...}

withPool似乎不起作用。以防万一,如果有人想限制线程,我就是这么做的。我们可以使用自定义线程池创建自定义组,并指定线程数

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()
}
def customGroup=new DefaultPGroup(new DefaultPool(true,5))
试一试{
Dataflow.usingGroup(customGroup{
def promises=新的承诺列表()
(1..100)。每个{number->

protip承诺,您不需要线程来进行多个异步调用,只是不阻塞will doBenjamin,目的是阻止此调用的返回,直到所有这些异步调用完成并收集其结果并立即将其发送回。阻塞是有意的,线程专门允许阻塞和收集回答-如果有另一种方法使一堆异步,然后阻止,直到所有回来,我愿意接受你可能提供的任何建议。我的问题是如何然后节流,使1000个呼叫不会一次中断服务器。你会提出什么来实现这些目标?我不知道:公平地说,在Scala中是D(设置
ExecutionContext
)、JavaScript(
{concurrency:8}
)或C#(
。带degreeofparallelism(8)
)我知道答案。你当然可以自己实现。当然,我知道如何使用其他不那么理想的方法来实现。承诺是Groovy的多线程,所以我希望有一种内置的方法来限制线程。嗨,Graeme。好吧,那么GPAR会更好地使用它的声音中的承诺。我想ht承诺是较新版本中的默认承诺,因为它们在grails.async包中?不管怎样,我必须更好地阅读您的链接,但它听起来像是我们想要的。GPAR可以阻止控制器返回,直到所有线程都完成吗?我今天无法尝试,但文档看起来像我在所以我要赞扬你,格雷姆。谢谢!在grails async 3(4?)中,使用GPAR仍然是实现可重用线程池的推荐方法吗?还是有一些内置机制?