我有一个循环,如下面的示例所示,可以正常工作。我试图使其平行,但它给出了错误。如何使其平行(或问题出在哪里)?
Message: No signature of method: org.hibernate.collection.PersistentSet.eachParallel() is applicable for argument types: (com.example.ExampleController$_getOrgsWithSpec..
// Example domain class
Organization {
OrgProfile orgProfile
IndProfile indProfile
}
//same for IndProfile
OrgProfile {
static mapping = {
specs lazy:false
cache true
}
static hasMany = [
specs: Specs
]
}
// --------------------------------
//Controller methods
// Normal code (works)
def getOrgsWithSpec = { orgs ->
def s = []
orgs.each { o ->
if (o.type == 1) { //just an example
o.orgProfile?.specs?.findAll { m ->
if (m.id == specId) {
s.push(o)
}
}
} else if (o.type == 2) {
o.indProfile?.specs?.findAll { m ->
if (m.id == specId) {
s.push(o)
}
}
}
}
return s
}
// With GPars (not working)
def getOrgsWithSpec = { orgs ->
def s = []
GParsPool.withPool {
orgs.eachParallel { o ->
if (o.type == 1) {
o.orgProfile?.specs?.findAllParallel { m ->
if (m.id == specId) {
s.push(o)
}
}
} else if (o.type == 2) {
o.indProfile?.specs?.findAllParallel { m ->
if (m.id == specId) {
s.push(o)
}
}
}
}
}
return s
}
最佳答案
您是否已将getOrgsWithSpec()方法的主体包装在withPool块中?
withPool {
orgs.eachParallel {...}
}
另外,请注意,在eachParallel()中使用's'累加器需要受到保护,也许可以通过使其成为同步列表来加以保护。因此collectParallel {}可能是一个更好的选择。
关于grails - 尝试使循环与GPar并行执行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17920269/