尝试在Groovy中并行运行循环迭代 - 获取错误

时间:2016-09-27 17:42:48

标签: multithreading groovy

我列出了需要完成的数十万个任务(按任意顺序)。它们需要几个小时才能完成。我认为加速它的好方法是尝试并行运行它。

这里是对单线程并且工作正常的代码的最小复制:

doTask = { more ->
    println("Start")
    sleep 10000  // sleep 10 seconds
    println("Finish")
}

(1..3).each{ more -> doTask(more) }

我之前没有Groovy的经验,所以这个功能语法对我来说有点陌生......但我发现很多关于SO的问题,人们建议你查看这个页面:

http://groovy.codehaus.org/Concurrency+with+Groovy

Linkrot已经发生 - 该页面已不存在,但我确实在这里找到了它的存档:

https://web.archive.org/web/20150102212441/http://groovy.codehaus.org/Concurrency+with+Groovy

我尝试调整该页面中的示例并最终得到:

import java.util.concurrent.*

pool = Executors.newFixedThreadPool(3)

defer = {c -> pool.submit(c as Callable) }
doTask = { more ->
    println("Start")
    sleep 10000 // sleep 10 seconds
    println("Finish")
}

(1..3).each{ more -> defer{doTask(more)} }

当我在这里运行时: http://groovyconsole.appspot.com/

我收到此错误:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
    at Script1$_run_closure1.doCall(Script1.groovy:5)
    at Script1$_run_closure3.doCall(Script1.groovy:12)
    at Script1.run(Script1.groovy:12)

发生了什么?我有点搞砸了语法吗?我滥用API吗?这可能只是该网站的限制吗?

1 个答案:

答案 0 :(得分:1)

不,这段代码对我来说运行正常......异常可能是因为您使用的appspot webconsole不允许运行多线程应用程序。

下载Groovy并使用Groovy Console运行它,它会正常工作。

但是这里有一个简化代码的建议:

import java.util.concurrent.Callable
import java.util.concurrent.Executors

pool = Executors.newFixedThreadPool( 3 )

doTask = { more ->
    println "Start"
    sleep 10000 // sleep 10 seconds
    println "Finish"
}

( 1..3 ).each { more -> pool.submit { doTask( more ) } }

在Groovy中,大括号之间的任何内容都是您可以提交到池中的闭包。

所以pool.submit { /* any code here to run async */ }有效。