6

C# 和 Scala 都采用了框架来简化异步/并行计算,但方式不同。最新的 C#(5.0,仍处于测试阶段)已决定使用 async/await 框架(在底层使用 continuation-passing,但以更易于使用的方式),而 Scala 则使用“actors”的概念,并且最近在 Akka 中实现了 actor 并将其合并到基础库中。

下面是一个需要考虑的任务:我们收到一系列请求来执行各种操作——例如,来自用户输入、对服务器的请求等。有些操作很快,但有些需要一段时间。对于较慢的,我们希望异步执行操作(在另一个线程中)并在线程完成时处理它,同时仍然可以自由处理新请求。

一个简单的同步循环可能是(伪代码):

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 和使用 actor 会如何表达,更一般地说,这些方法的优点/缺点是什么?

4

3 回答 3

5

请考虑我的部分答案:“旧” Scala 演员已被 Akka 演员取代,这不仅仅是一个简单的 async/await 库。

  1. Akka Actor 是“消息处理程序”,它们被组织成一个层次结构,可以在一个或多个 JVM 上运行,甚至分布在网络上。
  2. 当您意识到您的异步处理需要参与者时(稍后阅读为什么这不是强制必要的),Akka 让您并帮助您在故障处理、调度和路由方面建立最佳模式
  3. Akka 带有不同的传输层,以及其他花哨的即用型工具,例如显式有限状态机、数据流并发等。
  4. Akka自带Futures,更可能对应C# 5.0中的Async/Await框架

你可以在 Akka 网站或这篇文章中阅读更多关于 Akka 期货的信息:

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 回答
2

Scala 还实现了 async/await 范式,它可以简化一些算法。

这是建议: http ://docs.scala-lang.org/sips/pending/async.html

这是实现: https ://github.com/scala/async

于 2013-11-21T09:19:33.197 回答