Grails Groovy PromiseMap-我可以限制异步线程池吗?
我正在制作一个(快速而肮脏的)批处理API,它允许UI发送一系列REST API调用,并一次获得所有调用的结果 我正在使用PromiseMap对相关服务进行一些异步REST调用,这些调用随后被收集 可能需要运行大量线程,我想限制同时运行的线程数量,类似于Executor的线程池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
//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仍然是实现可重用线程池的推荐方法吗?还是有一些内置机制?