2016-09-27 13 views
0

私は数十万のタスクを(任意の順序で)実行する必要があります。それらをすべて実行するには数時間かかります。私はそれをスピードアップする良い方法を、それを並行して走らせることにしようと考えています。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を悪用していますか?これはおそらくそのウェブサイトの制限ですか?

+0

他のマシンにあるVM上にスレッドを作成しようとしています。これは、サイトをダウンさせるために簡単に使用でき、Webコンソールの権限を削除しました。ローカルで実行してみてください。 –

答えて

1

いいえ、このコードはうまく動作します...使用しているappspotウェブコンソールがマルチスレッドアプリケーションを実行できないため、例外が多分あります。

ダウンロードGroovyをGroovy Consoleと一緒に実行すると、正常に動作します。

しかし、ここでは、あなたのコードを少し単純化するための提案です:Groovyで

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

、中括弧の間に何があなたがプールに提出することができますクロージャです。

so pool.submit { /* any code here to run async */ }が動作します。

+0

ありがとう!私はおそらく、単純にその「遅延」機能を削除する方法があると思っていましたが、私は最初にどのように例外を処理していたかについてより大きな懸念を抱いていました。 Groovyをダウンロードしてコンソールにコードを実行しました。出来た! (私のコードは実際にヘッドレスサーバーで動作していますが、私がGroovyをインストールしていない唯一の理由です) – ArtOfWarfare

+0

Java 8の 'parallelStream':'(1..3).parallelStream()を使用してプールを回避することさえできます。 map(more)} .toArray() '(map()'がレイジーなので、toArray()が必要です)。 – Renato

+0

Java/Groovyのどのバージョンが使用されているのかよくわかりません(実行中の実際のVMに到達するための複雑なレイヤーがたくさんあります...実行可能な実行可能ファイル内のどこかのリモートマシン上に埋め込まれています) )。私はあまりにも新しいものを誤って使用する機会を最小限に抑えるために、永遠に残っていたAPIに固執しようとしています... – ArtOfWarfare

関連する問題