2016-11-01 3 views
0

これは簡単なはずですが、どうやってそれを行うのか分かりません。 ScalaZ Taskを現在のスレッドで実行したい。私は同期しているので、task.runが現在のスレッドで実行されないことに驚きました。現在のスレッドでScalaZタスクを実行するには

現在のスレッドで実行することはできますか?

+0

ここからunsafeStartの説明を見てください。 http://timperrett.com/2014/07/20/scalaz-task-the-missing-documentation/ –

答えて

0

http://timperrett.com/2014/07/20/scalaz-task-the-missing-documentation/以降、一部のアップデートと廃止がありました。

今同期タスクを呼び出す推奨される方法は次のとおりです。

task.unsafePerformSync  // returns result or throws exception 
task.unsafePerformSyncAttempt // returns -\/(error) or \/-(result) 

は、それが正確に呼び出し側のスレッドで行われていないこと、しかし、覚えておいてください - 実行がために定義されたスレッド・プールに施行しています実行が終了するまで呼び出し元のスレッドはブロックされます。同じスレッド内でタスクを正確ににする方法はありません。一般的に

+0

「タスクが定義されたスレッドプールで実行が完了しました」という言い方は全く間違っています。この 'Task.delay(" aaa ")。map(_ + 1)'を考えてみましょう。コンパイル時にスレッドプールを要求しましたか? – dk14

0

Task.asyncを使用する場合は、 - 複合Taskは常にcb(コールバック)と同じスレッドにとどまるようにする方法はありませんチェーンのようになるように、任意の場所(任意のスレッド)から呼び出すことができます。

Task 
    .delay("aaa") 
    .map(_ + "bbb") 
    .flatMap(x => Task.async(cb => completeCallBackSomewhereElse(cb, x))) 
    .map(_ + "ccc") 
    .unsafePerformSync 

_ + "bbb" つもりつもりscalazとしてSomewhereelseのスレッドで実行される

_ + "ccc"は、それを制御することはできません、呼び出し元のスレッドで実行されています。

基本的には、Taskは非同期操作の強力な手段となるため、基礎となるスレッドプールについても知らず、純粋なスレッドや待機/通知なしの動作を実装することさえできません。

1)いいえStrategy/Task.async関連するもの:

Task.delay("aaa").map(_ + "bbb").unsafePerformSync 

unsafePerformSyncrunAsyncの結果を待つためにCountDownLatchを使用していますので、

しかし、それは、呼び出し元ランとして働くかもしれない特別な場合があります途中で非同期/非決定的操作がない場合 - runAsynccaller's threadを使用します。

/** 
    * Run this `Future`, passing the result to the given callback once available. 
    * Any pure, non-asynchronous computation at the head of this `Future` will 
    * be forced in the calling thread. At the first `Async` encountered, control 
    * switches to whatever thread backs the `Async` and this function returns. 
    */ 
    def runAsync(cb: A => Unit): Unit = 
    listen(a => Trampoline.done(cb(a))) 

2)実行戦略を制御できます。だからthis simple Java trickが役に立ちます。また、すでにスカラズに実装されていると呼ばれています。Strategy.sequential


P.S.

1)できるだけ早く計算を開始したい場合は、task.now/Task.unsafeStartを使用してください。

2)あなたは、非同期のものにあまり大きく関連しているが、まだ怠惰とスタック安全な何かをしたい場合は、あなただけの側面をカプセル化する必要がある場合(それは)http://eed3si9n.com/herding-cats/Eval.html

3)猫のライブラリのためだ、ここを見てかかることがあります-effects - 見てみようscalaz.effect

関連する問題