加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#5.0 async / await与Akka actor对比基本fork / join的例子?

发布时间:2020-12-16 03:34:58 所属栏目:百科 来源:网络整理
导读:C#和 Scala都采用了框架来简化异步/并行计算,但方式不同.最新的C#(5.0,仍然处于测试阶段)已决定使用async / await框架(使用延续传递,但使用方式更简单),而Scala则使用“actors”的概念,最近在Akka中采用了演员实现并将其合并到基础库中. 这是一项需要考虑的
C#和 Scala都采用了框架来简化异步/并行计算,但方式不同.最新的C#(5.0,仍然处于测试阶段)已决定使用async / await框架(使用延续传递,但使用方式更简单),而Scala则使用“actors”的概念,最近在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和使用actor来表达这种外观,更一般地说这些方法的优点/缺点是什么?

解决方法

请将我的视为部分答案:“旧的”Scala演员已经被Akka演员取代,而Akka演员更像是一个简单的异步/等待库.

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

您可以在Akka网站或此帖子上阅读有关Akka期货的更多信息:

Parallel file processing in Scala

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读