SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
Файберы
Невытесняющая многозадачность
           на Java
public final class RequestCreateAvatar {
  private final String avatarName;

}
                  S
  private final Character character;
                                                          R
void createAvatar(String avatarName, Character character) {
                               MsgRequest
  sendCmd(new RequestCreateAvatar(avatarName, character));
      Async<Void> createAvatar(String avatarName,          Character character) {
}
          CreateAvatarResult result = call(avatarManager.createAvatar(
                avatarName, characterfinal class CreateAvatarHandler {
                                public
          ));                                                     RequestHandler()
                                  public void handle(RequestCreateAvatar msg) {
          sendMsgToClient(result); CreateAvatarResult result = avatarManager.createAvatar(msg);
                                    sendMsg(new ResponseCreateAvatar(result));
                          MsgResponse
          return nothing();       }
      }                              }

public final class CreateAvatarResponseHandler {
  public void handle(ResponseCreateAvatar msg) {
    sendMsgToClient(msg);  ResponseHandler()
  }
}
Причины
• Хочется писать простой линейный Java-код
• ОС-потоки слишком накладны
• Требуется сохранить однопоточный дизайн
С высоты птичьего полёта
Инструментатор   Планировщик



   Рантайм        Инспекции
Синтаксис (1)
          import fibers.Async;
          import static fibers.Fiber.*;

Async<Integer>{ calcResult(int factor) {
         class Foo
           Async<Integer> calcResult(int factor) {
  return result(42*factor);
             return result(42*factor);
Async<Integer> doWork() {
}          }

  int tmp Async<Integer> doWork() {
            = сall(calcResult(314));
             int tmp = call(calcResult(314));
  return result(tmp);
             return result(tmp);
}        }
           }
Синтаксис (2)
class Foo {
  void bar(FiberManager f) {
    f.scheduleFiber(doWork("Hi!"));
  }
}
Препарируемый метод
Async<String> baz(String second) {
  String first = call(getFirst());
  return result(join(first, second));
}
Замена исходного метода
Async<String> baz(String second) {
  return new baz_Context(second);
}
Контекст вызова метода
class baz_Context extends Async<String> {
  String _second, first;

    @Override
    void update() { state = baz_Async(this); }
}
Инструментированный метод
int baz_Async(baz_Context c) {
  switch (c.state) {
    case 0: c.result = getFirst(); return 1;
    case 1: c.first = (String) c.takeResult();
            c.result = join(c.first, c._second);
            return -1;
  }
}
Инструментирование (1)
• Поиск точек разрыва
  – call
  – yield
• Вставка switch-case и return
Инструментирование (2)
• Как обойти вызов   Async<Integer> foo() {
  блока finally?       try {
                         int t = call(bar());
• Не вызывать его!
                         return result(t);
                       } finally { close(); }
                     }
Инструментирование (3)
• Подмена доступа к параметрам метода и
  локальным переменным
• int x; x = 42;  context.x = 42;
Инструментирование (4)
                     ...
                   case 42
...                  Context r = new bar_Context();
x = call(bar());     c.pushCall(r);
...
                     return 43;
                   case 43:
                     c.x = (String) c.takeResult();
                     ...
Инструментирование (5)
• Директивы, ссылающиеся на исходный файл,
  вставляются инструментатором в
  сгенерированный метод
• Это позволяет использовать пошаговую
  отладку
• Ограничение: нельзя с помощью Step Over
  перейти через точку разрыва
Исключения
• Рантайм ловит все исключения, вылетевшие из
  Async-метода
• Исключение заворачивается в служебный объект
• При запросе результата вызывающим Async-
  методом исключение выбрасывается заново
• Если исключение вылетает за пределы файбера, то
  это диагностируется как ошибка
Прерывание файбера
• В каждой точке входа в Async-метод
  проверяется, не был ли прерван текущий
  файбер
• Если файбер был прерван, то
  выбрасывается служебное исключение
  FiberInterruptedException
Функции FiberManager
• Планировщик
• Обрабатывает приостановку,
  возобновление и прерывание файберов
• У всех файберов одинаковый приоритет
Гарантии FiberManager
• Файберы должны исполняться в порядке
  добавления и возобновления
• Приостановленные файберы не должны
  исполняться
Thread safety
• Методы scheduleFiber() и resumeFiber()
  могут выполняться из любого потока
• Все остальные методы – только из потока, к
  которому привязан планировщик
• На каждый поток есть свой планировщик
StackTrace (1)
• Stack trace из new Throwable().getStackTrace() не
  достаточен
• Программист хочет видеть:
   – стек Async-методов
   – стек в момент порождения файбера
• Файбер может быть создан внутри другого файбера
• Stack trace должен разрешаться (resolve) только
  тогда, когда он реально необходим
StackTrace (2)
• Рантайм получает уже готовое исключение
• К этому исключению нужно добавить
  – стек файбера
  – стек момента порождения файбера
• Используется addSuppressed()
StackTrace (3)
• Переопределяется метод fillInStackTrace(),
  чтобы не собирать обычный stack trace
• Массив StackTraceElement[] формируется
  только по запросу getCause() и при
  сериализации
java.lang.Throwable
     at asserts.Verify.fail(Verify.java:47)
     at gm.cc.c.t.CmdTeleportRandomByMapType.asyncRun$Async(CmdTeleportRandomByMapType.jav
     at gm.cc.c.t.CmdTeleportRandomByMapType$Context_asyncRun_LmsgSystem#locales#Abonent_.
     at f.i.AsyncImpl.updateSafe(AsyncImpl.java:37)
     at f.i.FiberImpl.updateInternal(FiberImpl.java:154)
     at f.i.FiberImpl.update(FiberImpl.java:130)
     at f.i.FiberManagerAbstract.updateFiber(FiberManagerAbstract.java:297)
     ...
     at java.lang.Thread.run(Thread.java:722)
     Suppressed: f.i.FiberStackTraceHolderException: Fiber stack trace
     Caused by: f.i.FiberStackTraceHolderException$Helper
          at asserts.Verify.fail(Verify.java:47)
          at gm.cc.c.t.CmdTeleportRandomByMapType.asyncRun(CmdTeleportRandomByMapType.java
          at ms.l.AsyncMsg.run(AsyncMsg.java:37)
          at ms.i.mp.ServerMsgPublisher.processMsg(ServerMsgPublisher.java:331)
          at ms.i.mp.ServerMsgPublisher.addMsgFast(ServerMsgPublisher.java:118)
          ...
          at java.lang.Thread.run(Thread.java:722)
Узкие места (1)
• Инструментатор меняет сигнатуру метода
• Служебные методы call() и result() вырезаются,
  чтобы байткод соответствовал новой сигнатуре
• Об этом не догадывается IntelliJ Idea, которая
  вставляет проверки на != null
• Инструментатор вырезает такие проверки из
  Async-методов
Узкие места (2)
• Если Async-метод декларирует throws
  SomeUncheckedException
  – синтаксис java потребует его обработки
  – catch-блок для этого исключения никогда не будет
    вызван
  – исключение пролетит в рантайм, т. к. для него нет
    соответствующего catch
Узкие места (3)
• Синтаксис не запрещает вызов Async-
  метода из обычного
• Вызываемый метод не исполнится
Узкие места (4)
• Точки разрыва не могут быть в блоке finally
• Причина: в этом случае исключение может
  быть проигнорировано
Альтернативные решения
• Apache Javaflow
• DaVinci VM
• Kilim
С е р ге й З а г ур с к и й
в е д у щ и й п р о г р а м м и с т, п р о е к т S k y f o r g e
           s.zagurskiy@corp.mail.ru

Mais conteúdo relacionado

Mais procurados

Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...Alexey Paznikov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...Alexey Paznikov
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...Alexey Paznikov
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3Eugeniy Tyumentcev
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Alexey Paznikov
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAlex Tumanoff
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Haskell
HaskellHaskell
HaskellDevDay
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...Alexey Paznikov
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...Alexey Paznikov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 

Mais procurados (20)

Parallel STL
Parallel STLParallel STL
Parallel STL
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++.   Р...
ПВТ - осень 2014 - Лекция 5 - Многопоточное программирование в языке С++. Р...
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
ПВТ - весна 2015 - Лекция 3. Реентерабельность. Сигналы. Локальные данные пот...
 
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
ПВТ - весна 2015 - Лекция 6. Разработка параллельных структур данных на основ...
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Async clinic by by Sergey Teplyakov
Async clinic by by Sergey TeplyakovAsync clinic by by Sergey Teplyakov
Async clinic by by Sergey Teplyakov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Haskell
HaskellHaskell
Haskell
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
ПВТ - осень 2014 - Лекция 4 - Стандарт POSIX Threads. Реентерабельность. Сигн...
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 

Destaque (19)

ярослав рабоволюк
ярослав рабоволюкярослав рабоволюк
ярослав рабоволюк
 
Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)
 
Balashov
BalashovBalashov
Balashov
 
Kalugin balashov
Kalugin balashovKalugin balashov
Kalugin balashov
 
Smirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforumSmirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforum
 
Zamyakin
ZamyakinZamyakin
Zamyakin
 
Platov
PlatovPlatov
Platov
 
Rabovoluk
RabovolukRabovoluk
Rabovoluk
 
Zenovich
ZenovichZenovich
Zenovich
 
Zacepin
ZacepinZacepin
Zacepin
 
A.pleshkov
A.pleshkovA.pleshkov
A.pleshkov
 
Panfilov
PanfilovPanfilov
Panfilov
 
Perepelitsa
PerepelitsaPerepelitsa
Perepelitsa
 
Bubnov
BubnovBubnov
Bubnov
 
Haritonov
HaritonovHaritonov
Haritonov
 
Romanenko
RomanenkoRomanenko
Romanenko
 
Osipov
OsipovOsipov
Osipov
 
Chudov
ChudovChudov
Chudov
 
Kubasov
KubasovKubasov
Kubasov
 

Semelhante a Zagursky

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3etyumentcev
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitByndyusoft
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirCodeFest
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...solit
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerAnton Arhipov
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 

Semelhante a Zagursky (20)

разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
course js day 2
course js day 2course js day 2
course js day 2
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Reactive extensions
Reactive extensionsReactive extensions
Reactive extensions
 
Киллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/awaitКиллер-фича языка C# — конструкция async/await
Киллер-фича языка C# — конструкция async/await
 
Bytecode
BytecodeBytecode
Bytecode
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Сладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и ZephirСладкое будущее: Phalcon и Zephir
Сладкое будущее: Phalcon и Zephir
 
Thread
ThreadThread
Thread
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
C# Deep Dive
C# Deep DiveC# Deep Dive
C# Deep Dive
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
Solit 2014, Реактивный Javascript. Победа над асинхронностью и вложенностью, ...
 
JPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profilerJPoint 2016 - Etudes of DIY Java profiler
JPoint 2016 - Etudes of DIY Java profiler
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 

Mais de kuchinskaya

владимир габриелян
владимир габриелянвладимир габриелян
владимир габриелянkuchinskaya
 
чашкин иван
чашкин иванчашкин иван
чашкин иванkuchinskaya
 
сумин андрей
сумин андрейсумин андрей
сумин андрейkuchinskaya
 
митасов роман
митасов романмитасов роман
митасов романkuchinskaya
 
кренин владимир
кренин владимиркренин владимир
кренин владимирkuchinskaya
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедевkuchinskaya
 
дыдыкин егор
дыдыкин егордыдыкин егор
дыдыкин егорkuchinskaya
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридоновkuchinskaya
 
игорь ермаков
игорь ермаковигорь ермаков
игорь ермаковkuchinskaya
 
дмитрий юдин3
дмитрий юдин3дмитрий юдин3
дмитрий юдин3kuchinskaya
 

Mais de kuchinskaya (11)

Kharkov
KharkovKharkov
Kharkov
 
владимир габриелян
владимир габриелянвладимир габриелян
владимир габриелян
 
чашкин иван
чашкин иванчашкин иван
чашкин иван
 
сумин андрей
сумин андрейсумин андрей
сумин андрей
 
митасов роман
митасов романмитасов роман
митасов роман
 
кренин владимир
кренин владимиркренин владимир
кренин владимир
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
 
дыдыкин егор
дыдыкин егордыдыкин егор
дыдыкин егор
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридонов
 
игорь ермаков
игорь ермаковигорь ермаков
игорь ермаков
 
дмитрий юдин3
дмитрий юдин3дмитрий юдин3
дмитрий юдин3
 

Zagursky

  • 1.
  • 3. public final class RequestCreateAvatar { private final String avatarName; } S private final Character character; R void createAvatar(String avatarName, Character character) { MsgRequest sendCmd(new RequestCreateAvatar(avatarName, character)); Async<Void> createAvatar(String avatarName, Character character) { } CreateAvatarResult result = call(avatarManager.createAvatar( avatarName, characterfinal class CreateAvatarHandler { public )); RequestHandler() public void handle(RequestCreateAvatar msg) { sendMsgToClient(result); CreateAvatarResult result = avatarManager.createAvatar(msg); sendMsg(new ResponseCreateAvatar(result)); MsgResponse return nothing(); } } } public final class CreateAvatarResponseHandler { public void handle(ResponseCreateAvatar msg) { sendMsgToClient(msg); ResponseHandler() } }
  • 4.
  • 5. Причины • Хочется писать простой линейный Java-код • ОС-потоки слишком накладны • Требуется сохранить однопоточный дизайн
  • 6. С высоты птичьего полёта Инструментатор Планировщик Рантайм Инспекции
  • 7. Синтаксис (1) import fibers.Async; import static fibers.Fiber.*; Async<Integer>{ calcResult(int factor) { class Foo Async<Integer> calcResult(int factor) { return result(42*factor); return result(42*factor); Async<Integer> doWork() { } } int tmp Async<Integer> doWork() { = сall(calcResult(314)); int tmp = call(calcResult(314)); return result(tmp); return result(tmp); } } }
  • 8. Синтаксис (2) class Foo { void bar(FiberManager f) { f.scheduleFiber(doWork("Hi!")); } }
  • 9. Препарируемый метод Async<String> baz(String second) { String first = call(getFirst()); return result(join(first, second)); }
  • 10. Замена исходного метода Async<String> baz(String second) { return new baz_Context(second); }
  • 11. Контекст вызова метода class baz_Context extends Async<String> { String _second, first; @Override void update() { state = baz_Async(this); } }
  • 12. Инструментированный метод int baz_Async(baz_Context c) { switch (c.state) { case 0: c.result = getFirst(); return 1; case 1: c.first = (String) c.takeResult(); c.result = join(c.first, c._second); return -1; } }
  • 13. Инструментирование (1) • Поиск точек разрыва – call – yield • Вставка switch-case и return
  • 14. Инструментирование (2) • Как обойти вызов Async<Integer> foo() { блока finally? try { int t = call(bar()); • Не вызывать его! return result(t); } finally { close(); } }
  • 15. Инструментирование (3) • Подмена доступа к параметрам метода и локальным переменным • int x; x = 42;  context.x = 42;
  • 16. Инструментирование (4) ... case 42 ... Context r = new bar_Context(); x = call(bar()); c.pushCall(r); ... return 43; case 43: c.x = (String) c.takeResult(); ...
  • 17. Инструментирование (5) • Директивы, ссылающиеся на исходный файл, вставляются инструментатором в сгенерированный метод • Это позволяет использовать пошаговую отладку • Ограничение: нельзя с помощью Step Over перейти через точку разрыва
  • 18. Исключения • Рантайм ловит все исключения, вылетевшие из Async-метода • Исключение заворачивается в служебный объект • При запросе результата вызывающим Async- методом исключение выбрасывается заново • Если исключение вылетает за пределы файбера, то это диагностируется как ошибка
  • 19. Прерывание файбера • В каждой точке входа в Async-метод проверяется, не был ли прерван текущий файбер • Если файбер был прерван, то выбрасывается служебное исключение FiberInterruptedException
  • 20. Функции FiberManager • Планировщик • Обрабатывает приостановку, возобновление и прерывание файберов • У всех файберов одинаковый приоритет
  • 21. Гарантии FiberManager • Файберы должны исполняться в порядке добавления и возобновления • Приостановленные файберы не должны исполняться
  • 22. Thread safety • Методы scheduleFiber() и resumeFiber() могут выполняться из любого потока • Все остальные методы – только из потока, к которому привязан планировщик • На каждый поток есть свой планировщик
  • 23. StackTrace (1) • Stack trace из new Throwable().getStackTrace() не достаточен • Программист хочет видеть: – стек Async-методов – стек в момент порождения файбера • Файбер может быть создан внутри другого файбера • Stack trace должен разрешаться (resolve) только тогда, когда он реально необходим
  • 24. StackTrace (2) • Рантайм получает уже готовое исключение • К этому исключению нужно добавить – стек файбера – стек момента порождения файбера • Используется addSuppressed()
  • 25. StackTrace (3) • Переопределяется метод fillInStackTrace(), чтобы не собирать обычный stack trace • Массив StackTraceElement[] формируется только по запросу getCause() и при сериализации
  • 26. java.lang.Throwable at asserts.Verify.fail(Verify.java:47) at gm.cc.c.t.CmdTeleportRandomByMapType.asyncRun$Async(CmdTeleportRandomByMapType.jav at gm.cc.c.t.CmdTeleportRandomByMapType$Context_asyncRun_LmsgSystem#locales#Abonent_. at f.i.AsyncImpl.updateSafe(AsyncImpl.java:37) at f.i.FiberImpl.updateInternal(FiberImpl.java:154) at f.i.FiberImpl.update(FiberImpl.java:130) at f.i.FiberManagerAbstract.updateFiber(FiberManagerAbstract.java:297) ... at java.lang.Thread.run(Thread.java:722) Suppressed: f.i.FiberStackTraceHolderException: Fiber stack trace Caused by: f.i.FiberStackTraceHolderException$Helper at asserts.Verify.fail(Verify.java:47) at gm.cc.c.t.CmdTeleportRandomByMapType.asyncRun(CmdTeleportRandomByMapType.java at ms.l.AsyncMsg.run(AsyncMsg.java:37) at ms.i.mp.ServerMsgPublisher.processMsg(ServerMsgPublisher.java:331) at ms.i.mp.ServerMsgPublisher.addMsgFast(ServerMsgPublisher.java:118) ... at java.lang.Thread.run(Thread.java:722)
  • 27. Узкие места (1) • Инструментатор меняет сигнатуру метода • Служебные методы call() и result() вырезаются, чтобы байткод соответствовал новой сигнатуре • Об этом не догадывается IntelliJ Idea, которая вставляет проверки на != null • Инструментатор вырезает такие проверки из Async-методов
  • 28. Узкие места (2) • Если Async-метод декларирует throws SomeUncheckedException – синтаксис java потребует его обработки – catch-блок для этого исключения никогда не будет вызван – исключение пролетит в рантайм, т. к. для него нет соответствующего catch
  • 29. Узкие места (3) • Синтаксис не запрещает вызов Async- метода из обычного • Вызываемый метод не исполнится
  • 30. Узкие места (4) • Точки разрыва не могут быть в блоке finally • Причина: в этом случае исключение может быть проигнорировано
  • 31. Альтернативные решения • Apache Javaflow • DaVinci VM • Kilim
  • 32. С е р ге й З а г ур с к и й в е д у щ и й п р о г р а м м и с т, п р о е к т S k y f o r g e s.zagurskiy@corp.mail.ru