2009-09-04 1 views
5

Scalaでノンブロッキングメソッドを作成する良い方法はありますか?私が考えることのできる1つの方法は、スレッド/アクターを作成することです。メソッドはスレッドにメッセージを送信して返します。非ブロッキングメソッドを作成するより良い方法はありますか?Scalaで非ブロッキングメソッドを作成するには?

答えて

13

使用scala.actors.Future:

import actors._ 

def asyncify[A, B](f: A => B): A => Future[B] = (a => Futures.future(f(a))) 

// normally blocks when called 
def sleepFor(seconds: Int) = { 
    Thread.sleep(seconds * 1000) 
    seconds 
} 

val asyncSleepFor = asyncify(sleepFor) 
val future = asyncSleepFor(5) // now it does NOT block 
println("waiting...")   // prints "waiting..." rightaway 
println("future returns %d".format(future())) // prints "future returns 5" after 5 seconds 

つ以上のパラメータを持つ関数を取るオーバーロード「asyncifyは」運動として残っています。

しかし、注意点の1つは例外処理です。 "非同期化"されている関数は、すべての例外をキャッチして処理する必要があります。関数からスローされた例外の動作は未定義です。

2

「ブロックする」という定義によります。厳密に言えば、ロックの取得を必要とするものはブロックしています。アクタの内部状態に依存するすべての操作は、アクタのロックを取得します。これにはメッセージ送信が含まれます。多くのスレッドが一度にアクターにメッセージを送信しようとすると、それらは一列に並ばなければなりません。

本当にノンブロッキングが必要な場合は、java.util.concurrentにさまざまなオプションがあります。

実践的な観点から見ると、俳優は、同期した操作のどれも大量の作業をしないため、非閉塞に近いものを提供します。したがって、アクターがあなたの必要を満たす可能性があります。

1

私は先物に関してブログで非常に徹底した説明をしています。実際にあなた自身で先物を実装する方法を示しています。したがって、トピックについての非常に良い理解が得られます。私はあなたがそれを読むことをお勧め:

http://vigtig.it/blog/?p=73

あなたのコーヒーをお忘れなく!

関連する問題