2016-10-11 11 views
2

私はScalaz Taskをたくさん持っています。Scalazタスクを並行して実行する方法

val tasks = for (i <- 1 to 50) yield { 
    Task.delay({ 
    Thread.sleep(100L) 
    println(i) 
    i 
    }) 
} 

val r = Nondeterminism[Task].gatherUnordered(tasks).run 
println(r.mkString(" ")) 

私はタスクが並行して実行されると予想します。無作為な順番で数字を印刷し、5秒かかることはありません(それぞれ50タスクと100ミリスリープがあります)。

しかし、各タスクが100ミリ秒かかり、すべてが5秒かかり、作成されたリストが注文されることは明らかです。

パラレルで実行するにはどうすればよいですか?タスクはどこで実行するスレッドを取るか?

答えて

3

Task.delayは、引数の評価を中断しますが、評価がどこで行われるかについては何も言いません。

import scalaz.Nondeterminism, scalaz.concurrent.Task 

val tasks = for (i <- 1 to 50) yield { 
    Task { 
    Thread.sleep(100L) 
    println(i) 
    i 
    } 
} 

val r = Nondeterminism[Task].gatherUnordered(tasks).run 
println(r.mkString(" ")) 

これは、固定されたスレッドプールをラップデフォルトExecutorServiceを使用します:あなたはそれが評価がで起こるであろうスレッド決定する暗黙のExecutorServiceを取ることを除いて、同じシグネチャを持つTask.applyを、したいです。異なる戦略が必要な場合は、別のExecutorServiceを暗黙のスコープに入れるか、Task.applyの2番目の引数リストに明示的に指定するかのいずれかを行うことができます。

関連する問題