我列出了需要完成的数十万个任务(按任意顺序)。它们需要几个小时才能完成。我认为加速它的好方法是尝试并行运行它。
这里是对单线程并且工作正常的代码的最小复制:
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吗?这可能只是该网站的限制吗?
答案 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 */ }
有效。