1

以下の例に示すように、機能するループがあります。並列にしようとしていますが、エラーが発生します。並列にする方法(または問題はどこですか)?

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
}
4

1 に答える 1

1

getOrgsWithSpec() メソッドの本体を withPool ブロッ​​クでラップしましたか?

withPool { orgs.eachParallel {...} }

また、 eachParallel() 内で「s」アキュムレータを使用することは、おそらく同期リストにすることで保護する必要があることに注意してください。したがって、collectParallel{} の方がおそらくより適切な選択です。

于 2013-07-29T16:29:16.570 に答える