LINUX.ORG.RU

История изменений

Исправление shahid, (текущая версия) :

Асинхронное программирование: Future/Promise паттерн. Вроде бы, ты пишешь одну функцию, части которой раскиданы во времени, но фактически являются несколькими анонимными функциями, вызываемыми в некоторой последовательности или параллельно. Таким образом, у тебя получается неблокирующийся код без упоминания каких-либо thread/spawn и т.д.

def myfunction(arg: String): Future[Int] = {
  http_post("http://site.com/form/" + arg) flatMap {
    case 200 =>
      // сделать другой запрос. http_get() также возвращает Future[Int]
      http_get("http://site.com/ok/" + arg)
    case _ =>
      Future.failed(new Exception(...))
  }
}
Результат myfunction() содержит либо результат работы http_get(), либо ошибку от внешнего case. Выполнение функции идёт в несколько шагов:

  • начинается http_post() который сразу вовзращает Future[Int] и уходит в фон. Вызывается flatMap(), которому передаётся лямбда. Функция myfunction() возвращает результат вызова flatMap() без выполнения тела переданной лямбды, т.е. значение типа Future[Int] (1). Тело лямбды как бы поставилось в очередь на выполнение. Далее, основной поток выполнения программы идёт куда-то дальше, возможно комбинирует полученный фьючерс (1) с другими лямбдами или делает что-то ещё, хотя http-запрос ещё возможно даже не начался.
  • Через какое-то время выполнился первый запрос, из пула потоков достаётся поток и начинает выполнять лямбду, переданную во flatMap(). Лямбда имеет прозрачный для программиста доступ к данным внешней функции, которая уже давно завершилась. http_get() возвращает другой результат Future[Int] (2). Поток возвращается назад в пул потоков.
  • Через ещё какое-то время выполнился второй запрос. Результат запроса отправляется в (2), который, благодаря flatMap(), отправляет это значение в (1).

Сейчас всё серверное программирование идёт в асинхрон для оптимизации нагрузки и снижения латентности (например, серверы finagle, twisted, play-framework, etc, etc), поэтому лямбды или какие-то другие инструменты очень нужны, чтобы писать асинхронно-работающий код, практически не усложняя его.

Исправление shahid, :

Асинхронное программирование: Future/Promise паттерн. Вроде бы, ты пишешь одну функцию, части которой раскиданы во времени, но фактически являются несколькими анонимными функциями, вызываемыми в некоторой последовательности или параллельно. Таким образом, у тебя получается неблокирующийся код без упоминания каких-либо thread/spawn и т.д.

def myfunction(arg: String): Future[Int] = {
  http_post("http://site.com/form/" + arg) flatMap {
    case 200 =>
      // сделать другой запрос. http_get() также возвращает Future[Int]
      http_get("http://site.com/ok/" + arg)
    case _ =>
      Future.failed(new Exception(...))
  }
}
Результат myfunction() содержит либо результат работы http_get(), либо ошибку от внешнего case. Выполнение функции идёт в несколько шагов:

  • начинается http_post() который сразу вовзращает Future[Int] и уходит в фон. Вызывается flatMap(), которому передаётся лямбда. Функция myfunction() возвращает результат вызова flatMap() без выполнения самой лямбда, т.е. значение типа Future[Int] (1). Тело лямбды как бы поставилось в очередь на выполнение. Далее, основной поток выполнения программы идёт куда-то дальше, возможно комбинирует полученный фьючерс (1) с другими лямбдами или делает что-то ещё, хотя http-запрос ещё возможно даже не начался.
  • Через какое-то время выполнился первый запрос, из пула потоков достаётся поток и начинает выполнять лямбду, переданную во flatMap(). Лямбда имеет прозрачный для программиста доступ к данным внешней функции, которая уже давно завершилась. http_get() возвращает другой результат Future[Int] (2). Поток возвращается назад в пул потоков.
  • Через ещё какое-то время выполнился второй запрос. Результат запроса отправляется в (2), который, благодаря flatMap(), отправляет это значение в (1).

Сейчас всё серверное программирование идёт в асинхрон для оптимизации нагрузки и снижения латентности (например, серверы finagle, twisted, play-framework, etc, etc), поэтому лямбды или какие-то другие инструменты очень нужны, чтобы писать асинхронно-работающий код, практически не усложняя его.

Исходная версия shahid, :

Асинхронное программирование: Future/Promise паттерн. Вроде бы, ты пишешь одну функцию, части которой раскиданы во времени, но фактически являются несколькими анонимными функциями, вызываемыми в некоторой последовательности или параллельно. Таким образом, у тебя получается неблокирующийся код без упоминания каких-либо thread/spawn и т.д.

def myfunction(arg: String): Future[Int] = {
  http_post("http://site.com/form/" + arg) flatMap {
    case 200 =>
      // сделать другой запрос. http_get() также возвращает Future[Int]
      http_get("http://site.com/ok/" + arg)
    case _ =>
      Future.failed(new Exception(...))
  }
}
Результат myfunction() содержит либо результат работы http_get(), либо ошибку от внешнего case. Выполнение функции идёт в несколько шагов:

  • начинается http_post() который сразу вовзращает Future[Int] и уходит в фон. Вызывается flatMap - функция myfunction() уже возвращает значение типа Future[Int] (1). Далее, основной поток выполнения идёт дальше по программе, комбинирует (1) с другими лямбдами или делает что-то ещё, хотя http-запрос ещё даже толком не начался.
  • Через какое-то время выполнился первый запрос, из пула потоков достаётся поток и начинает выполнять лямбду, переданную во flatMap. Лямбда имеет прозрачный для программиста доступ к внешним данным. http_get() возвращает другой результат Future[Int] (2). Поток возвращается назад в пул потоков.
  • Через ещё какое-то время выполнился второй запрос. Результат запроса отправляется в (2), который, благодаря flatMap, отправляет это значение в (1).

Сейчас всё серверное программирование идёт в асинхрон для оптимизации нагрузки и снижения латентности (серверы finagle, twisted, play-framework, etc, etc), поэтому лямбды или какие-то другие инструменты очень нужны, чтобы писать асинхронно-работающий код, практически не усложняя его