C# と Scala はどちらも、非同期/並列計算を簡素化するためのフレームワークを採用していますが、その方法は異なります。最新の C# (5.0、まだベータ版) は async/await フレームワーク (ボンネットの下で継続渡しを使用しますが、使いやすい方法で) を決定しましたが、Scala は代わりに「アクター」の概念を使用し、は最近、Akka でアクターの実装を取得し、ベース ライブラリに組み込みました。
考慮すべきタスクは次のとおりです。たとえば、ユーザー入力、サーバーへのリクエストなど、さまざまな操作を行う一連のリクエストを受け取ります。一部の操作は高速ですが、一部の操作には時間がかかります。遅いものについては、操作を (別のスレッドで) 非同期で実行し、スレッドが完了したときにそれを処理する一方で、新しいリクエストを自由に処理したいと考えています。
単純な同期ループは次のようになります (疑似コード):
while (1) {
val request = waitForAnything(user_request, server_request)
val result = do_request(request)
if (result needs to be sent back)
send_back_result(result)
}
基本的な fork/join フレームワークでは、次のようなことを行う場合があります (疑似コード)。
val threads: Set[Thread]
while (1) {
val request = waitForAnything(user_request, server_request, termination of thread)
if (request is thread_terminate) {
threads.delete(request.terminated_thread)
val result = request.thread_result
if (result needs to be sent back)
send_back_result(result)
} else if (request is slow) {
val thread = new Thread(() => do_request(request))
Threads.add(thread)
thread.start()
} else {
val result = do_request(request)
if (result needs to be sent back)
send_back_result(result)
}
}
これは、async/await とアクターを使用してどのように表現されますか?また、より一般的には、これらのアプローチの利点/欠点は何ですか?