В докладе разбираются основные заблуждения и ошибки в использовании async/await, а также дается список полезных советов по написанию асинхронного кода.
Многопоточное Программирование - Теория и ПрактикаRoman Elizarov
Многоядерные процессоры используются во всех серверах, рабочих станциях и мобильных устройствах. Написание многопоточных программ необходимо для обеспечения вертикальной масштабируемости, но, в отличие от однопоточных программ, их намного сложней отладить и протестировать, чтобы убедиться в корректности. Важно понимать какие именно гарантии дают те или иные конструкции языка и библиотеки при их многопоточном исполнении и какие подводные камни могут нарушить корректность кода. Доклад будет содержать краткое введение в теорию многопоточного программирования. Мы рассмотрим теоретические модели, которые используются для описания поведения многопоточных программ. Будут рассмотрены понятия последовательной согласованности и линеаризуемости (с примерами) и объяснено зачем это все-нужно программисту-практику. Будет показано как эти понятия применяются в модели памяти Java с примерами кода приводящего к неожиданным результатам с точки зрения человека, который с ней не знаком.
Доклад сделан для конференции Java Point Student Day 2016.
В докладе разбираются основные заблуждения и ошибки в использовании async/await, а также дается список полезных советов по написанию асинхронного кода.
Многопоточное Программирование - Теория и ПрактикаRoman Elizarov
Многоядерные процессоры используются во всех серверах, рабочих станциях и мобильных устройствах. Написание многопоточных программ необходимо для обеспечения вертикальной масштабируемости, но, в отличие от однопоточных программ, их намного сложней отладить и протестировать, чтобы убедиться в корректности. Важно понимать какие именно гарантии дают те или иные конструкции языка и библиотеки при их многопоточном исполнении и какие подводные камни могут нарушить корректность кода. Доклад будет содержать краткое введение в теорию многопоточного программирования. Мы рассмотрим теоретические модели, которые используются для описания поведения многопоточных программ. Будут рассмотрены понятия последовательной согласованности и линеаризуемости (с примерами) и объяснено зачем это все-нужно программисту-практику. Будет показано как эти понятия применяются в модели памяти Java с примерами кода приводящего к неожиданным результатам с точки зрения человека, который с ней не знаком.
Доклад сделан для конференции Java Point Student Day 2016.
Презентация к докладу - работа с потоками в .net
* Основе работы с потоками
* Средства блокирующей синхронизации
* Неблокирующая синхронизация
* Асинхронная модель программирования
* Пул потоков
* Класс BackGroundWorker
* Задачи
* Модель поставщик-потребитель
* Блокировка с двойной проверкой
PHP libevent Daemons. A high performance and reliable solution. Practical exp...Arvids Godjuks
It is considered (rigthly in most cases) that it's a bad manner to implement a daemon using PHP. It's OK for prototyping but no-no for production. That were our thoughts when we've started to implement a new version of browser game. It was planned to describe an interface to communicate with daemon that will be then rewritten in pure C.
However, fist libevent PHP daemon performance tests forced us to think if we really need to rewrite it in C. What was the performance? Are there memory leaks? All these will be covered in the speech.
You will also learn about problems, features and how a real project results.
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.
Reactive programming для успеха вашего стартапаVitebsk DSC
Что такое реактивное программирование. Каким принципам оно следует. Как оно может помочь создать современную систему, особенно если вы разрабатываете "с нуля".
Презентация подготовлена по материалам выступления Кирилла Миловидова на витебской конференции “Developer's Software Conference” (31.10.2015). Запись выступления: https://events.epam.com/events/dsc2015/talks/105.
Управление ресурсами в Linux и OpenVZ Кирилл Колышкин kir@openvz.org http://openvz.org/
Отчет - http://yourcmc.ru/wiki/RootConf_2009:_%D0%9E%D1%82%D1%87%D1%91%D1%82_%D0%92%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D1%8F_%D0%A4%D0%B8%D0%BB%D0%B8%D0%BF%D0%BF%D0%BE%D0%B2%D0%B0#.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.80.D0.B5.D1.81.D1.83.D1.80.D1.81.D0.B0.D0.BC.D0.B8_.D0.B2_Linux_.D0.B8_OpenVZ_.28.D0.B7.D0.B0.D1.87.D1.91.D1.82.21.29
Презентация к докладу - работа с потоками в .net
* Основе работы с потоками
* Средства блокирующей синхронизации
* Неблокирующая синхронизация
* Асинхронная модель программирования
* Пул потоков
* Класс BackGroundWorker
* Задачи
* Модель поставщик-потребитель
* Блокировка с двойной проверкой
PHP libevent Daemons. A high performance and reliable solution. Practical exp...Arvids Godjuks
It is considered (rigthly in most cases) that it's a bad manner to implement a daemon using PHP. It's OK for prototyping but no-no for production. That were our thoughts when we've started to implement a new version of browser game. It was planned to describe an interface to communicate with daemon that will be then rewritten in pure C.
However, fist libevent PHP daemon performance tests forced us to think if we really need to rewrite it in C. What was the performance? Are there memory leaks? All these will be covered in the speech.
You will also learn about problems, features and how a real project results.
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
Модули threading, queue и concurrent.futures. Использование потоков для параллельных вычислений на Python. GIL. Параллельность и конкурентность. Модуль asyncio. Модуль multiprocessing.
Reactive programming для успеха вашего стартапаVitebsk DSC
Что такое реактивное программирование. Каким принципам оно следует. Как оно может помочь создать современную систему, особенно если вы разрабатываете "с нуля".
Презентация подготовлена по материалам выступления Кирилла Миловидова на витебской конференции “Developer's Software Conference” (31.10.2015). Запись выступления: https://events.epam.com/events/dsc2015/talks/105.
Управление ресурсами в Linux и OpenVZ Кирилл Колышкин kir@openvz.org http://openvz.org/
Отчет - http://yourcmc.ru/wiki/RootConf_2009:_%D0%9E%D1%82%D1%87%D1%91%D1%82_%D0%92%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D1%8F_%D0%A4%D0%B8%D0%BB%D0%B8%D0%BF%D0%BF%D0%BE%D0%B2%D0%B0#.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.80.D0.B5.D1.81.D1.83.D1.80.D1.81.D0.B0.D0.BC.D0.B8_.D0.B2_Linux_.D0.B8_OpenVZ_.28.D0.B7.D0.B0.D1.87.D1.91.D1.82.21.29
2. Минусы событий .NET
•Требует указания конкретного делегата
•Затрудняет использование лямбд
•Провоцирует утечки ресурсов
Отписка
• Обработка событий с учетом временных зависимостей
крайне затрудненаУчет времени
•Для потока данных есть LINQ, а для потока событий это
невозможно – событие не значение первого классаКомпозиция
•В каком контексте будет выполнятся обработчик – зависит от
событияСинхронность
3. События как интерфейсы
•Это источник событий, аналог event
•Единственный метод – подписка : IDisposable Subscribe( IObserver<T> observer )
•Отписка, если нужна – простым вызовом Dispose
IObservable<T>
•Это приемник событий, аналог IEventHandler из нашего Delphi-фреймворка
•Основной метод – обработка события void OnNext(T value )
•Уведомление, что событий больше не будет void OnCompleted()
• Уведомление, что об ошибке в источнике void OnError(Exception error )
IObserver<T>
•Событие как интерфейс - значение первого класса
•Можно использовать с using
•Знакомый классический паттерн банды четырех после нашего фреймворка Delphi и
Java
Плюсы
•Методы Subscribe и Dispose должны быть потокобезопасными
•Наблюдатель не должен выбрасывать исключения из своих реализаций методов
•Не рекомендуется отменять регистрацию в реализации Subscribe
•Не рекомендуется подписывать одного наблюдателя на несколько потоков событий
Требования
4. Да будет LINQ!
• Поток событий – аналог потока данных
• GetEnumerator = Subscribe
• Current = OnNext + OnException
• !MoveNext = OnComplete
• Dispose = subscribe.Dispose
IEnumerable
IObservable
• LINQ для событий возможен, как и для любых значений первого класса
• По семантике LINQ для потоков событий похож на LINQ для коллекций
• Только в самом фреймворке ничего такого нет
LINQ2events
• Готовые универсальные реализации IObservable и IObserver
• При подписке можно просто указывать обработчики, а также токен отмены
• Реализация LINQ для IObservable
• Поддержка асинхронности, параллелизма и конвертации в привычные
сущности (последовательности, события, задачи, асинхронные вызовы) и
обратно
Reactive
Extensions
5. Особенности потоков событий
•Для событий в одном потоке задано отношение полного порядка
– одно событие раньше, другое - позже
•Новое событие не будет передано подписчикам до окончания
обработки предыдущего
Упорядоченность
•У события есть время возникновения
•ToInterval добавляет время между событиями
•Throttle исключает частые события
•Множество других фильтров и комбинаторов с учетом времени
Темпоральность
•Возникновение события в общем случае не привязано к
текущему контексту
•Поток событий – аналог асинхронного вызова для множества
возвращаемых результатов
Асинхронность
6. Генераторы событий
Статические методы Observable
•Return – ровно одно событие
•Empty – ни одного события, сразу конец
•Throw – сразу ошибка
•Never – абсолютная тишина, ни одного вызова
Примитивные
•Range – аналогично как и для IEnumerable
•Generate – аналог цикла forПоследовательные
•Timer – одно событие в указанное время или через
указанный временной интервал
•Interval – события с указанным временным интервалом
между ними
Временные
7. Горячие и холодные источники
• Генерируют события только при подписке
• Выдают каждому подписчику все сообщения с самого начала
• Пример – ранее приведенные генераторы
Холодные
• Генерируют события независимо от наличия подписчиков
• Выдают подписчикам события только в период подписки, разделяя
каждое сообщение между всеми подписчиками
• Пример – события от клавиатуры и мыши
Горячие
• Метод расширения Publish возвращает горячий источник, позволяя
разделять одну подписку на холодный между несколькими
наблюдателямиРазогрев
8. Планировщики
• Sheduler.Immediate – немедленное выполнение без планирования
• Scheduler.CurrentThread – c контролем deadlock’овОднопоточные
• Scheduler.NewThread – выполнение в новом потоке
• Scheduler.TaskPool – выполнение в TPL.Task
• Scheduler.ThreadPool – выполнение в пуле потоков
Многопоточные
• DispatcherScheduler – выполнение в потоке UI для WPF/Silverlight
• ControlScheduler – то же для WinFormsUI
• Автоматический – ничего указывать не надо, будет выбран наиболее
подходящий
• В LINQ – можно явно указать для последовательности с помощью метода
ObserveOn
Выбор
9. Мосты
• Методы ToObservale и ToEnumerable
• Все стандартные ToXXX методы LINQ
Последовательности и
коллекции
• Метод FromEventPattern
• Можно указать методы для подписки и отписки
• Для событий по шаблону EventHandler можно указать имя (найдется с
помощью отражения)
События
• Метод FromAsyncPattern
• Превращает вызов в поток событий с одним элементом - результатомАсинхронные вызовы
• Метод расширения для задачи ToObservable
• Метод расширения для источника ToTask (вернет последнее значение)
• Задача от источника событий отличается только количеством результатов
Задачи
10. Drag & Drop
• var mousedown = from evt in
Observable.FromEvent<MouseButtonEventArgs>(this, "MouseDown")
select evt.EventArgs.GetPosition(this);
Нажатия
• var mouseup = from evt in
Observable.FromEvent<MouseButtonEventArgs>(this, "MouseUp" )
select evt.EventArgs.GetPosition(this);
Отпускания
• var mousemove = from evt in
Observable.FromEvent<MouseEventArgs>(this, "MouseMove" )
select evt.EventArgs.GetPosition(this);
Перемещения
• var q = from start in mousedown from pos in
mousemove.StartWith(start).TakeUntil(mouseup)
select pos;
Перетаскивание
• q.ObserveOnDispatcher().Subscribe(
value => textBlock.Text = value.ToString());Обновление UI
11. Асинхронный вызов
• Используется метод расширения using, гарантирующий
вызов Dispose после завершения потока событий
• Observable.Using(() => new WCFServiceClient()
Автоочистка
ресурсов
• , client => Observable.
FromAsyncPattern<RequestType, ResponseType>(
client.BeginWCFMethod,
client.EndWCFMethod)(request))
Конвертация
вызова
• .Subscribe(
response => response.List.ForEach(WriteOutBusiness),
ex => Console.WriteLine("Error = " + ex.Message),
() => Console.WriteLine("Completed."));
Обработка
результата
12. Источники вдохновения
1. Шаблон разработки Observer
2. Композиционный стиль программирования с
Reactive Extensions (презентация)
3. Библиотека реактивных расширений (видео)
4. Creating and Subscribing to Simple Observable
Sequences
5. Jesse Liberty – Reactive
6. “Реактивные расширения” и асинхронные
операции