actor model

71
Actor Model Курс Параллельные вычисления Цесько Вадим Александрович http://kspt.ftk.spbstu.ru/people/tsesko/ @incubos Санкт-Петербургский государственный политехнический университет 10 декабря 2012 г. Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 1 / 71

Upload: vadim-tsesko

Post on 28-Nov-2014

1.078 views

Category:

Technology


1 download

DESCRIPTION

Слайды лекции по Actor Model, прочитанной в рамках курса "Параллельные вычисления": http://kspt.ftk.spbstu.ru/course/parallel

TRANSCRIPT

Actor ModelКурс «Параллельные вычисления»

Цесько Вадим Александровичhttp://kspt.ftk.spbstu.ru/people/tsesko/

@incubos

Санкт-Петербургский государственный политехнический университет

10 декабря 2012 г.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 1 / 71

Содержание

1 Введение

2 Actor Model

3 Futures and Promises

4 Dataflow Concurrency

5 Software Transactional Memory

6 ЗаключениеЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 2 / 71

Введение Обо мне

Обо мне

5 лет в Digitek LabsПараллельные системы цифровой обработкисигналовСтатический анализ кода программных систем

2 года в ЯндексРаспределённые высоконагруженные системы

ПреподаваниеБазы данныхФормальные методы обеспечения качества ПО

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 3 / 71

Введение Disclaimer

Disclaimer

Must WatchJonas Boner. State: You’re Doing It Wrong — AlternativeConcurrency Paradigms For The JVMa. JavaOne 2009.

ahttp://www.slideshare.net/jboner/state-youre-doing-it-wrong-javaone-2009

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 4 / 71

Введение Параллельное программирование

Параллельное программирование

Damien KatzBeginner: "Threads are hard."Intermediate: "Don’t fear multithreading."Expert: "Threads are hard."

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 5 / 71

Введение Проблема

Проблема

Источник болиРазделяемое состояние.

А если точнее, тоИзменяемое разделяемое состояние.

НоЭто неизбежно.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 6 / 71

Введение Классификация задач и подходов

Классификация задач и подходов

Shared State Concurrency (чугунная пуля)Невероятно сложноДаже для экспертов

Координация независимых задач/процессовПланирование, игрыMessage-Passing Concurrency (Actor Model)

Workflow-зависимые процессыБанковская сфера, MapReduceDataflow Concurrency

Консенсус и истинное разделяемое знаниеБанковская сфераSoftware Transactional Memory (STM)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 7 / 71

Actor Model Происхождение

Происхождение

Carl Hewitt1, Peter Bishop and Richard Steiger. AUniversal Modular Actor Formalism for ArtificialIntelligence. 1973.Gul Agha. Actors: A Model of ConcurrentComputation in Distributed Systems. 1986.Изначально для описания параллельныхвычисленийПозднее в качестве основы для многочисленныхреализаций

1http://letitcrash.com/post/20964174345/carl-hewitt-explains-the-essence-of-the-actor

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 8 / 71

Actor Model Actor

Actor

Всё это акторФункционируют параллельноАсинхронно обмениваются сообщениямиПри обработке сообщения актор может

отправить конечное число сообщений другим акторамсоздать конечное число новых акторовназначить поведение для обработки следующегосообщения

Порядок доставки сообщений не специфицированАкторы имеют «адреса»

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 9 / 71

Actor Model Concurrency vs Parallelism

Concurrency vs Parallelism

Actor Model не о Parallelism, а о Concurrency2

ConcurrencyСпособность выполняться параллельно.

ParallelismДействительно параллельное выполнение.

2Rob Pike. Concurrency is not Parallelism:https://player.vimeo.com/video/49718712

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 10 / 71

Actor Model Реализации

Реализации

Языки3 с «родной» поддержкой:ErlangScala...

Библиотеки для языков:ScalaJavaF#...

3http://en.wikipedia.org/wiki/Actor_modelЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 11 / 71

Actor Model Реализации

Erlang

Joe Armstrong, Ericsson, 1986Для разработки распределённых,отказоустойчивых, неостанавливающихсяприложений мягкого реального времениПоддерживает «горячую» замену кодаПример — ПО коммутатора Ericsson AXD301

миллион строк кодадоступность 0.999999999 (31 ms/year downtime)

Parallelism vs ConcurrencyПоддержка SMP в 2006.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 12 / 71

Actor Model Реализации

Akka

Будем использоватьAkka (Scala API).

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 13 / 71

Actor Model Наш опыт

Класс систем

Яндекс.АвтоЯндекс.Недвижимость

ETL-процесс:1 Extract — загрузка внешних данных2 Transform — унификация, кластеризация, ...3 Load — построение и раскладка индекса

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 14 / 71

Actor Model Наш опыт

Статистика

Данные:До 104 источниковДо 107 сущностей20% обновляется ежедневно2x рост за год

Пользователи4:Яндекс.Авто — 4.5 млн. чел.Яндекс.Недвижимость — 2 млн. чел.

4http://stat.yandex.ruЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 15 / 71

Actor Model Akka

О проекте

Jonas Boner:Java ChampionTerracotta JVM clustering, JRockit JVM,AspectWerkz AOP, Eclipse AspectJ

Ресурсы:http://akka.io/docs/http://letitcrash.com/

Код:https://github.com/akka/akkaApache V2 license

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 16 / 71

Actor Model Akka

Производительность

ВниманиеСинтетические тесты ,

Erlang R14B04 vs Akka 2.0-SNAPSHOT5:1M mps vs 2.1M mps

Akka 2.06:50M mps48-core, 128 GB, ForkJoinPool

5http://letitcrash.com/post/14783691760/akka-vs-erlang6http://letitcrash.com/post/20397701710/

50-million-messages-per-second-on-a-single-machineЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 17 / 71

Actor Model Akka

Особенности реализации

300 байт на акторАктор: состояние, поведение, почтовый ящик,список детей, стратегия супервизораМножество акторов на множестве нитейНет гарантированной доставки, семантикаat-most-once, порядок сохраняетсяСообщения обрабатываются строго по порядкуИерархия: создаваемые акторы — дети,родитель — супервизорАктор скрыт за переносимой ActorRefПодход «Let it crash»

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 18 / 71

Actor Model Akka

Ссылки

Чисто локальныеЛокальные ссылкиСсылки для маршрутизации (Router)Ссылки на удалённых акторовОсобые: PromiseActorRef, DeadLetterActorRef,EmptyLocalActorRef (DeadLetterActorRef)

Примеры путейakka://system/user/service/workerakka://[email protected]:2552/user/service

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 19 / 71

Actor Model Akka

Конструирование ссылок

Создание акторов: ActorSystem.actorOf илиActorContext.actorOfПоиск акторов: ActorSystem.actorFor илиActorContext.actorForКаждый актор знает себя, родителя и детей

Можно делать так:1 context.actorFor("../brother") ! msg2 context.actorFor("/user/service") ! msg3 context.actorSelection("../*") ! msg

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 20 / 71

Actor Model Akka

Именование в локальной системе

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 21 / 71

Actor Model Akka

Пути

Типы путей:ЛогическийФизический

Особые пути:/user/system/deadLetters/temp/remote

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 22 / 71

Actor Model Akka

Удалённое развёртывание

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 23 / 71

Actor Model Akka

Actor Best Practices

Не блокироватьсяНеизменяемые сообщенияНет разделяемому состоянию«Опасные» подзадачи в дочерние акторыСобытия жизненного цикла

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 24 / 71

Actor Model Akka

Основные фичи

ActorsLoggingSchedulerDispatchersRoutingRemotingSerializationTestingFSMFault Tolerance

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 25 / 71

Actor Model Akka

Дополнительные фичи

Typed ActorsEvent BusFuturesDataflow ConcurrencySTMAgentsTransactorsDurable Mailboxes (file, Redis, ZooKeeper, Mongo)Akka Cluster

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 26 / 71

Actor Model Практические примеры

Определение актора1 class Partitioner(partitionStorage: ActorRef) extends Actor {2

3 lazy val log = Logging(context.system, this)4

5 def receive = {6 case PartitionFeed(partner, offers) =>7 partition(partner, offers)8 case msg =>9 log.error("Unsupported message received: {}", msg)

10 }11

12 def partition(partner: Partner, offers: Traversable[Offer]) {13 ...14

15 partitionStorage ! UpdatePartitions(partner, partitioning)16 }17 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 27 / 71

Actor Model Практические примеры

Создание актора

1 val system = ActorSystem("sharder")2

3 val partitionStorage = ...4

5 val partitioner = system.actorOf(Props(6 new Partitioner(7 partitionStorage8 )).withDispatcher("dispatcher.cpu")9 .withRouter(FromConfig()),

10 "partitioner")

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 28 / 71

Actor Model Практические примеры

Конфигурация диспетчераКонфигурация в HOCON7:

1 dispatcher {2 cpu {3 type = Dispatcher4 executor = "fork-join-executor"5 mailbox-capacity = 46 mailbox-push-timeout-time = 5m7

8 fork-join-executor {9 parallelism-min = 4

10 parallelism-factor = 1.011 }12 }13 }

7Human-Optimized Config Object Notation:https://github.com/typesafehub/config

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 29 / 71

Actor Model Практические примеры

Диспетчеры и ящики

Диспетчеры:DispatcherPinnedDispatcherBalancingDispatcherCallingThreadDispatcher

Почтовые ящики:UnboundedMailboxBoundedMailboxUnboundedPriorityMailboxBoundedPriorityMailboxDurable Mailboxes

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 30 / 71

Actor Model Практические примеры

Конфигурация маршрутизатора

1 akka.actor.deployment {2 /partitioner {3 router = smallest-mailbox4 nr-of-instances = 45 }6 }

1 akka.actor.deployment {2 /unifier {3 router = round-robin4 resizer {5 lower-bound = 26 upper-bound = 167 }8 }9 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 31 / 71

Actor Model Практические примеры

Маршрутизаторы

RoundRobinRouterRandomRouterSmallestMailboxRouterBroadcastRouterScatterGatherFirstCompletedRouter

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 32 / 71

Actor Model Практические примеры

Конфигурирование из кода

1 val shardActors =2 shards.map(system.actorFor(_)).toIndexedSeq3

4 val shard = system.actorOf(5 Props[PartitionReceiver]6 .withRouter(RoundRobinRouter(shardActors))7 .withDispatcher("dispatcher.shard"),8 "shard")

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 33 / 71

Actor Model Практические примеры

Распределённые акторы

1 akka {2 actor {3 provider = "akka.remote.RemoteActorRefProvider"4 }5

6 remote {7 transport = "akka.remote.netty.NettyRemoteTransport"8

9 netty {10 hostname = "server.yandex.ru"11 port = 255312 }13 }14 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 34 / 71

Actor Model Практические примеры

Пример теста

1 val probe = TestProbe()2 val burstScaler = TestActorRef(new BurstScaler(probe.ref))3

4 before {5 burstScaler.underlyingActor.sent =6 burstScaler.underlyingActor.sent.empty7 }8

9 "A BurstScaler" should {10 "always forward the first message" in {11 probe.within(1 second) {12 burstScaler ! 113 probe.expectMsg(1)14 }15 }16 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 35 / 71

Actor Model Практические примеры

Тестирование акторов

Модульное тестирование с TestActorRefИнтеграционное тестирование с ProbeПроверки с сопоставлением по шаблонуЗамедление времениДетализированные логи akka.actor.debug.*CallingThreadDispatcher

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 36 / 71

Actor Model Практические примеры

СупервизорРешение при сбое:

1 Resume2 Restart3 Stop4 Escalate

Принятое решение (1-3) действует рекурсивноФункция Exception ⇒ DirectiveTerminated, preStart, preRestart, postStop,postRestartOneForOneStrategy и AllForOneStrategyОграничение количества перезапусков

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 37 / 71

Actor Model Практические примеры

Супервизор по умолчанию

1 final val defaultStrategy: SupervisorStrategy = {2 def defaultDecider: Decider = {3 case _: ActorInitializationException => Stop4 case _: ActorKilledException => Stop5 case _: Exception => Restart6 case _ => Escalate7 }8 OneForOneStrategy()(defaultDecider)9 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 38 / 71

Actor Model Опыт

Акторы

Храните состояние вовнеСтройте всю систему на акторахПишите асинхронный кодИзбегайте косвенного взаимодействия акторовБаги есть, но быстро чинят

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 39 / 71

Actor Model Опыт

Память и ящики

Неограниченные ящики ⇒ неограниченная памятьпри перегрузкеОграниченные ящики ⇒ возможные deadlock’ипри наличии циклов⇒ стройте системы без циклов ,Существует диспетчер по умолчаниюНет доступа к размеру ящика8

8http://letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 40 / 71

Actor Model Alan Kay on OOP, 1967

Alan Kay on OOP, 1967

I thought of objects being like biological cells and/orindividual computers on a network, only able tocommunicate with messages (so messaging came at thevery beginning – it took a while to see how to domessaging in a programming language efficiently enoughto be useful).OOP to me means only messaging, local retention andprotection and hiding of state-process, and extremelate-binding of all things. It can be done in Smalltalk andin LISP. There are possibly other systems in which this ispossible, but I’m not aware of them.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 41 / 71

Futures and Promises

Futures and Promises

David RossSo a Promise can be broken, but you can’t change theFuture. Love the metaphors.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 42 / 71

Futures and Promises Происхождение

Происхождение

Henry Baker and Carl Hewitt. The IncrementalGarbage Collection of Processes9. 1977.

FutureСтруктура данных для синхронного(блокирующегося) или асинхронного(неблокирующегося) извлечения результатапараллельной операции.

9http://en.wikipedia.org/wiki/Futures_and_promisesЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 43 / 71

Futures and Promises Реализации

Реализации

Java (java.util.concurrent.Future)ScalaC#PythonHaskellClojureOzRSchemeNode.jsAkka

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 44 / 71

Futures and Promises Аkka Futures

Futures and Actors

Общение с акторами вне Actor System:1 implicit val timeout = Timeout(5 seconds)2

3 val future = actor ? msg4 val result =5 Await.result(future, timeout.duration)6 .asInstanceOf[String]

Или так:1 val future: Future[String] = ask(actor, msg).mapTo[String]

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 45 / 71

Futures and Promises Аkka Futures

Прямое использование

1 val future = Future {2 "Hello" + "World"3 }4 val result = Await.result(future, 1 second)

1 val future = Promise.successful("Yay!")

1 val otherFuture =2 Promise.failed[String](3 new IllegalArgumentException("Bang!"))

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 46 / 71

Futures and Promises Аkka Futures

Future — это монада: map (1)

1 val f1 = Future {2 "Hello" + "World"3 }4

5 val f2 = f1 map { x =>6 x.length7 }8

9 val result = Await.result(f2, 1 second)10

11 result must be(10)12

13 f1.value must be(Some(Right("HelloWorld")))

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 47 / 71

Futures and Promises Аkka Futures

Future — это монада: map (2)

1 val f1 = Future {2 "Hello" + "World"3 }4 val f2 = Promise.successful(3)5 val f3 = f1 map { x =>6 f2 map { y =>7 x.length * y8 }9 }

Тип f3?Future[Future[Int]]А хотели: Future[Int]

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 48 / 71

Futures and Promises Аkka Futures

Future — это монада: flatMap

1 val f1 = Future {2 "Hello" + "World"3 }4 val f2 = Promise.successful(3)5 val f3 = f1 flatMap { x =>6 f2 map { y =>7 x.length * y8 }9 }

10

11 val result = Await.result(f3, 1 second)12

13 result must be(30)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 49 / 71

Futures and Promises Аkka Futures

Future — это монада: filter

1 val future1 = Promise.successful(4)2 val future2 = future1.filter(_ % 2 == 0)3 val result = Await.result(future2, 1 second)4 result must be(4)5

6 val failedFilter = future1.filter(_ % 2 == 1).recover {7 case m: MatchError => 08 }9

10 val result2 = Await.result(failedFilter, 1 second)11 result2 must be(0)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 50 / 71

Futures and Promises Аkka Futures

Futures: композиция (1)

1 val f1 = ask(actor1, msg1)2 val f2 = ask(actor2, msg2)3

4 val a = Await.result(f1, 1 second).asInstanceOf[Int]5 val b = Await.result(f2, 1 second).asInstanceOf[Int]6

7 val f3 = ask(actor3, (a + b))8

9 val result = Await.result(f3, 1 second).asInstanceOf[Int]

БлокировкиКаждый вызов Await.result() — блокировка.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 51 / 71

Futures and Promises Аkka Futures

Futures: композиция (2)

1 val f1 = ask(actor1, msg1)2 val f2 = ask(actor2, msg2)3

4 val f3 = for {5 a <= f1.mapTo[Int]6 b <= f2.mapTo[Int]7 c <= ask(actor3, (a + b)).mapTo[Int]8 } yield c9

10 val result = Await.result(f3, 1 second).asInstanceOf[Int]

БлокировкиУже лучше, но усложняется с ростом числа акторов.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 52 / 71

Futures and Promises Аkka Futures

Futures: композиция (3)

1 Future.sequence:2 M[Future[A]] => Future[M[A]]

1 Future.traverse:2 M[A] => (A => Future[B]) => Future[M[B]]

1 Future.fold:2 Traversable[Future[T]] => R => ((R, T) => R) => Future[R]

1 Future.reduce[T, R >: T]:2 Traversable[Future[T]] => ((R, T) => R) => Future[R]

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 53 / 71

Futures and Promises Аkka Futures

Futures: Callbacks1 future onSuccess {2 case "bar" => println("Got my bar alright!")3 case x: String => println("Got some random string: " + x)4 }

1 future onFailure {2 case ise: IllegalStateException3 if ise.getMessage == "OHNOES" =>4 // OHNOES! We are in deep trouble, do something!5 case e: Exception =>6 // Do something else7 }

1 future onComplete {2 case Right(result) => doSomethingOnSuccess(result)3 case Left(failure) => doSomethingOnFailure(failure)4 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 54 / 71

Futures and Promises Аkka Futures

Futures: Порядок Callback’ов

Исполнение Callback’овОбработчики исполняются в неопределенномпорядке и/или параллельно.

1 val result = Future { loadPage(url) } andThen {2 case Left(exception) => log(exception)3 } andThen {4 case _ => watchSomeTV5 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 55 / 71

Futures and Promises Аkka Futures

Futures: Полезности

Future.fallbackTo():1 val future4 = future1 fallbackTo future2 fallbackTo future3

Future.zip():1 val future3 =2 future1 zip future2 map { case (a, b) => a + " " + b }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 56 / 71

Futures and Promises Аkka Futures

Futures and Exceptions

Исключения доставляются вместо результата Future.Но можно делать так:

1 val future = akka.pattern.ask(actor, msg1) recover {2 case e: ArithmeticException => 03 }

Или так:1 val future = akka.pattern.ask(actor, msg1) recoverWith {2 case e: ArithmeticException =>3 Promise.successful(0)4 case foo: IllegalArgumentException =>5 Promise.failed[Int](6 new IllegalStateException("All br0ken!"))7 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 57 / 71

Dataflow Concurrency Ссылки

Ссылки

Peter Van Roy and Seif Haridi. Concepts, Techniquesand Models of Computer Programming10.

10http://www.info.ucl.ac.be/~pvr/book.htmlЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 58 / 71

Dataflow Concurrency Реализация в Akka

Реализация в Akka

В стиле языка Oz11

Декларативное описаниеЛенивое вычисление «по требованию»Базируется на FuturesВычисление детерминированоНет разницы между последовательным ипараллельным кодомИспользует Scala Delimited Continuations

11http://www.mozart-oz.org/documentation/tutorial/node8.html#chapter.concurrency

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 59 / 71

Dataflow Concurrency Ограничения

Ограничения

Код должен быть без побочных эффектов —только «чистые» функцииПодход не общего назначенияПодходит для четко определенных изолированныхмодулей

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 60 / 71

Dataflow Concurrency Примитивы

Примитивы

Создание переменной потока данныхОжидание «связывания» переменнойСвязывание переменной

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 61 / 71

Dataflow Concurrency Примеры

Dataflow Delimiter (1)

1 import Future.flow2

3 implicit val dispatcher = ...4

5 val a = Future( ... )6 val b = Future( ... )7 val c = Promise[Int]()8

9 flow {10 c << (a() + b())11 }12

13 val result = Await.result(c, timeout)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 62 / 71

Dataflow Concurrency Примеры

Dataflow Delimiter (2)

1 import Future.flow2

3 implicit val dispatcher = ...4

5 val a = Future( ... )6 val b = Future( ... )7

8 val c = flow {9 a() + b()

10 }11

12 val result = Await.result(c, timeout)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 63 / 71

Dataflow Concurrency Примеры

Пример

1 import akka.dispatch._2 import Future.flow3

4 implicit val dispatcher = ...5

6 val x, y, z = Promise[Int]()7

8 flow {9 z << x() + y()

10 println("z = " + z())11 }12

13 flow { x << 40 }14

15 flow { y << 2 }

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 64 / 71

Software Transactional Memory Происхождение

Происхождение

Tom Knight. An Architecture for Mostly FunctionalLanguages. 1986.Maurice Herlihy and J. Eliot B. Moss. TransactionalMemory: Architectural Support for Lock-free DataStructures. 1993.Nir Shavit and Dan Touitou. Software TransactionalMemory. 1997.

Вначале как идея аппаратной поддержкитранзакцийВ дальнейшем развитие в сторону чистопрограммной транзакционной памяти

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 65 / 71

Software Transactional Memory Идея

Идея

Взгляд на память (Java Heap) как натранзакционный набор данныхПохоже на БД: begin, commit, abort/rollbackТранзакции автоматическиперезапускаются при коллизияхrollback при ошибкахСвойства ACI (из ACID)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 66 / 71

Software Transactional Memory Реализации

Реализации

Clojure STM12

Akka — войдет в SDK ScalaHaskelletc

Ссылки:Rich Hickey. Persistent Data Structures and ManagedReferences13

12http://clojure.org/state13http:

//www.infoq.com/presentations/Value-Identity-State-Rich-HickeyЦесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 67 / 71

Software Transactional Memory Свойства

Свойства

ДостоинстваТранзакции могут быть вложенными.

НедостаткиВсе операции в области действия транзакции должныбыть идемпотентными и не иметь побочныхэффектов.

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 68 / 71

Software Transactional Memory Примеры

Akka Transactional Agents1 def transfer(from: Agent[Int], to: Agent[Int], amount: Int):

Boolean = {2 atomic { txn =>3 if (from.get < amount) false4 else {5 from send (_ - amount)6 to send (_ + amount)7 true8 }9 }

10 }11

12 val from = Agent(100)13 val to = Agent(20)14 val ok = transfer(from, to, 50)15 val fromValue = from.await // -> 5016 val toValue = to.await // -> 70

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 69 / 71

Software Transactional Memory Потенциальные проблемы

Потенциальные проблемы

Множественные коллизии:Низкая производительность и большие задержкиОтсутствие прогресса (live locking)Несправедливость (unfairness)

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 70 / 71

Заключение

Заключение

Параллельные программы — это неизбежноНужны более простые способы созданиякорректных параллельных программныхсистемНизкоуровневый параллелизм — это чрезвычайносложноНо есть альтернативы:

Message-Passing Concurrency (Actor Model)Dataflow ConcurrencySoftware Transactional Memory (STM)

No Silver Bullet

Цесько В. А. (СПбГПУ) Actor Model 10 декабря 2012 г. 71 / 71