【发布时间】:2014-06-16 18:43:05
【问题描述】:
我正在制作一个(快速而肮脏的)批处理 API,它允许 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
我希望有一个我可能不知道的相当直接的设置。
谢谢。
【问题讨论】:
-
protip,你不需要线程来进行多个异步调用,只要不阻塞就可以了
-
Benjamin,其意图是阻止此调用的返回,直到所有这些异步调用完成并收集它们的结果并立即将它们发送回来。阻塞是有意的,线程是专门允许阻塞和收集响应的——如果有另一种方法可以使一堆异步然后阻塞直到全部回来,我愿意接受你可能提供的任何建议。我的问题是关于如何节流,以便 1000 个调用不会立即破坏服务器。你会提出什么来实现这些目标?
-
我不知道 :D 公平地说,在 Scala(设置
ExecutionContext)、JavaScript({concurrency: 8})或 C#(.WithDegreeOfParallelism(8))中,我知道答案。你当然可以自己实现。 -
当然,我知道如何使用其他不太理想的方法来做到这一点。 Promise 是 Groovy 的多线程,所以我希望已经内置了一种方法来限制线程。
标签: grails asynchronous groovy promise