Примеры C #5.0 async/await против акторов Akka против базового fork/join?

И C #, и Scala приняли фреймворки для упрощения выполнения асинхронных/параллельных вычислений, но по-разному. Последний C#(5.0, все еще находящейся в стадии бета-тестирования ), было принято решение об использовании асинхронной/ожидающей среды (, использующей продолжение -, проходящее под капотом, но в более простом -к -способе использования ), в то время как 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 и с использованием акторов, и в более общем смысле, каковы преимущества/недостатки этих подходов?

6
задан Urban Vagabond 5 August 2012 в 00:48
поделиться