特定の内部のみからメソッドを実行するにはどうすればよいExecutionContextですか?
たとえば、次のコードを検討してください。
trait SomeTrait {
private var notThreadSafe = 0 // mutable var!
def add(i: Int) = ???
def subtract(i: Int) = ???
}
addこのコードは、メソッドとメソッドsubtractが同じスレッドからのみ呼び出される場合にのみ正しいです。これらのメソッドが常に特定のものを使用するようにする方法は何ExecutionContextですか? 簡単な方法はありますか?
質問を理解するために、いくつかの回答例を次に示します。
Answer1Future.apply : 次のように、すべてのメソッドの本体を でラップします。
class SomeClass {
private implicit val ec: ExecutionContext = ???
private var notThreadSafe = 0
def add(i: Int) = Future {
???
}
def subtract(i: Int) = Future {
???
}
}
回答 2 : アクターを使用し、akkaすべてのメソッドを着信アクター メッセージに変換し、ask パターンを使用してアクターを操作します。意図的に混乱させなければ、すべてのメソッドはアクターの EC から実行されます。
回答 3 : 特性を Future 化されたバージョンに変換するマクロ関数を作成することはできますか? このコードを展開するように:
MyTrickyMacro.futurize(underlying: SomeTrait)(ec)
これに:
class MacroGeneratedClass(underlying: SomeTrait)(implicit ec: ExecutionContext) {
def add(i: Int) = Future(underlying.add(i))
def subtract(i: Int) = Future(underlying.subtract(i))
}
ここで、 Answer1は一般的には問題ないと思いますが、エラーが発生しやすく、ボイラープレートが少しあります。Answer2では、ボイラープレート コードを記述する必要があり、関数の引数を含むケース クラスを作成する必要があり、akka が必要です。そして、実装Answer3は見当たりませんでした。
だから...それを行う簡単な方法はありますか?