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

jw5wzhpr  于 2022-11-01  发布在  其他
关注(0)|答案(3)|浏览(163)

我正在制作一个(快速而肮脏的)批处理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

我希望有一个相当直接的设置,我可能是无知的。

  • 谢谢-谢谢
ycggw6v2

ycggw6v21#

Grails中默认的异步实现是GPars。要配置线程数,需要使用GParsPool。请参见:
http://gpars.org/guide/guide/dataParallelism.html#dataParallelism_parallelCollections_GParsPool
示例:

withPool(10) {...}
lvmkulzt

lvmkulzt2#

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()
}
3j86kqsm

3j86kqsm3#

用途

runtime 'org.grails:grails-async-gpars'

在构建.gradle和

GParsExecutorsPool.withPool(10){service ->
    Shop.list().each{shop ->
        Item.list().each{item ->
            service.submit({createOrder(shop, item)} as Runnable)
        }
    }
}

例如在您的服务中

相关问题