6

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 とアクターを使用してどのように表現されますか?また、より一般的には、これらのアプローチの利点/欠点は何ですか?

4

3 に答える 3

5

私の部分的な答えと考えてください。「古い」Scalaアクターは、単純な非同期/待機ライブラリよりもはるかに優れたAkkaアクターに置き換えられました。

  1. Akka アクターは「メッセージ ハンドラー」であり、1 つ以上の JVM で実行でき、ネットワーク全体に分散することもできる階層に編成されます。
  2. 非同期処理にアクターが必要であることがわかった場合 (これが強制的に必要でない理由は後で説明します)、Akka を使用すると、障害処理、ディスパッチ、およびルーティングに関して最適なパターンを配置できます。
  3. Akka には、さまざまなトランスポート層と、明示的な有限状態マシン、データフローの同時実行など、すぐに使用できる機能が付属しています。
  4. Akka には Futures が付属しています。これは、C# 5.0 の Async/Await フレームワークに対応する可能性が高いです。

Akka の先物について詳しくは、Akka の Web サイトまたは次の投稿をご覧ください。

Scala での並列ファイル処理

于 2012-07-23T10:05:25.647 に答える
2

Scala について話すことはできませんが、C# バージョンは次のようになります (IDE が手元にないので、エラーやタイプミスがある場合はご容赦ください:

public async Task<int> GetResult()
{
   while (true)
   {
      var request = await waitForAnything(user_request, server_request);
      var result = await do_request(request);
      if (isValid(result))
         return result;
   }
}

そして、あなたはそれを次のように呼ぶでしょう:

public void RunTheProgram()
{
   int result = await GetResult();
   Console.WriteLine("Result: {0}", result);
}

要するに、実際のコードは疑似コードと非常によく似ています。つまり、通常の人間が問題について考える方法と非常によく似ています。これが C# の async/await の真の美しさです。

于 2013-02-22T17:37:13.233 に答える