c# - C# 5.0 async/await vs. Akka actor vs. basic fork/join 的示例?

标签 c# scala parallel-processing actor async-await

C# 和 Scala 都采用了框架来简化异步/并行计算,但方式不同。最新的 C#(5.0,仍处于测试阶段)已经决定使用异步/等待框架(在后台使用连续传递,但以更易于使用的方式),而 Scala 则使用“参与者”的概念,并且最近采用了 Akka 中的 actors 实现并将其合并到基础库中。

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

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

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 来表达,更一般地说,这些方法的优点/缺点是什么?

最佳答案

请考虑我的部分回答:“旧的”Scala actors 已被 Akka actors 取代,Akka actors 远不止是一个简单的 async/await 库。

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

您可以在 Akka 网站或这篇文章中阅读有关 Akka future 的更多信息:

Parallel file processing in Scala

关于c# - C# 5.0 async/await vs. Akka actor vs. basic fork/join 的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599017/

相关文章:

c# - 在 cms 中制作用户友好的 url

c - 使用并行处理 MPI 迭代 2D 数组

c++ - openmpi mpmd 获取通信大小

c# - 在 C# 中合并两个 XML 文件,其中一个不一致

c# - 删除目录中最旧的文件

Scala 相当于 'forall a. Set a -> Set a -> Set a'

scala - Actor (scala/akka) : is it implied that the receive method will be accessed in a threadsafe manner?

scala - 在 Scala 中使用 case 语句破坏元组的规则

c# - Parallel.ForEach 多次迭代集合中的项目

c# - 在 HtmlEditor WinForms 上拦截粘贴事件