Место встречи
Сергей Платонов организовал московскую встречу Си++ разработчиков в конференц зале московской гостиницы Бородино, в районе Красносельского. Анонс группы и предварительная регистрация происходила посредством служб Google+, т.ч. тем кто пропустил, но хочет в дальнейшем быть в курсе, то милости прошу Google+ C++ User Group, Russia.
Некоторые утверждают, что Google+ мертв, но мне кажется вы все не поняли его фишку. Там нет никого, кроме программистов! И в этом его очарование - например, все Linux kernel разработчики там (потому как собственно Linus там). Приходите туда - там тихо, и мухи не летают!
Вообще, конечно, до того как у нас появится какой-то центральный сайт с информацией о российских Си++ событиях (типа isocpp.org но с проекцией на Россию, и конкретные города), узнавать приходится из разных источников и подчас случайно. Например, про готовящееся событие в Москве я узнал спросив @meetingcpp
@meetingcpp so what is the current state with Moscow CPPUG?
— Timur Safin (40+) (@tsafin) 17 января 2014
В любом случае, даже анонс через Google+ сработал вполне хорошо. На Питерское событие пришло порядка 20 человек, и это считалось успехом. Но на московскую встречу зарегистрировались уже 66, и 37 колебались. (Хорошо, что не все пришли, кстати, иначе я не знаю как мы бы решали эту проблему, зал реально был небольшим). Арендованный зал мог вместить 50-60 человек, и уже к концу первого доклада был почти полностью забит. Что можно считать успехом
С другой стороны Си++ программистов в Москве на 2 или 3 порядка больше, и надо задуматься как наиболее эффективно с точки зрения стоимости решать проблему с большим количеством посетителей, если практика устоится и станет популярной. Но об этом поговорим в последнем посте серии...
27 attendees on Moscow #cop users group. Ready to start
— Timur Safin (40+) (@tsafin) 15 февраля 2014
BTW, before 1st slides completed we have almost fully filled the hall #cpp #moscowcppusersgroup
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Но хватит лирики, давайте пойдем по докладам, один за одним, начиная с самой первой сессии.
Григорий Демченко - асинхронность и конкурентность на сопрограммах
Smoothly approaching boost.asio as async proactor implementation #cpp
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Григорий Демченко на примере простейшего http сервера с начала с последовательным кодом, но использующего все нужные Си++11 идиомы (типа лямбда-функций, auto, и последнего oost,asio), а потом и с асинхронным кодом, попытался рассказать про множество проблем, которые вас ждут при написании асинхронного кода на Си++. В любом случае Вас ожидает дилемма: удобный/читабельный код против эффективного использования ресурсов.
Григорий ввёл свои определения "параллельности" и "конкурентности" (которые могут не обязательно совпадать с классическими).
От синхронного кода простого сервера http Григорий перешел к более эффективному асинхронному с отложенными обработчиками в виде различных лямбд. По-прежнему для примеров использовались сервисы Boost::asio/ Автором утверждалось, что многопоточное асинхронное решение плохо масштабируется при росте запросов к серверу, посему было предложено использовать сопрограммы (coroutines) как более эффективное асинхронное решение
Any async code could be transformed to coroutines semiautomatically #cpp
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Утверждалось что любой чисто асинхронный код приведенный на ранних слайдах можно полуавтоматически перевести на использование сопрограм, и разработанной Григорием библиотеки synca.
Boost.context for coprograms
— Timur Safin (40+) (@tsafin) 15 февраля 2014
При работе с многопоточным приложением и при использовании механизма сопрограмм возникает необходимость сохранять/восстанавливать программный контекст сопрограммы. Для этих целей используются сервисы Boost.context, который уже адаптирован для многих операционных систем и архитектур. На вопрос зачем использовать boost.context при наличии в любом Си окружении sejmp/longjmp Григорий затруднился дать ответ.
Parallel vs concurrent: goWait pattern #cpp
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Григорий в своей библиотеке добавил множество примитивов для упрощения многопоточного программирования и работы с ресурсами например goWait - ожидание завершения всех аргументов (сопрограмм).
Several patterns for teleporting coroutines between threads #cpp
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Т.к. сопрограммы могут мигрировать с одного потока из пула на любой другой активный поток, то в библиотеки предоставляется API для переноса сопрограмм из контекста в контекст - "телепортация". Стилистически мне это API не очень понравилось (к тому же в глаза бросалось использование глобальных/нереентрантных данных), но пока будем считать это моей вкусовщиной, и придирками старого брюзги.
Boost::asio также знает про стренды. "Если вы понимаете о чем я говорю"
— Timur Safin (40+) (@tsafin) 15 февраля 2014
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Grigory Demchecnko on async was quite good. New boost services, and idioms covered #cpp #Moscow
— Timur Safin (40+) (@tsafin) 15 февраля 2014
Библиотека synca доступна на BitBucket https://bitbucket.org/gridem/synca так что смотрите сами. В целом, несмотря на эти маленькие придирки выше, данный доклад был интересен, и множество упомянутых идиом и паттернов будут крайне полезны многим при написании масштабируемых многопоточных приложений, даже если Вы не будете в итоге использовать synca или Boost::Asio.
Привет!
ОтветитьУдалитьХотелось бы немного прокомментировать пост.
> На вопрос зачем использовать boost.context при наличии в любом Си окружении setjmp/longjmp
Ну возможно я несколько размыто ответил. Если коротко, то setjmp/longjmp не позволяют сохранять контекст для создания сопрограмм.
> Стилистически мне это API не очень понравилось (к тому же в глаза бросалось использование глобальных/нереентрантных данных)
Хотелось бы уточнить, какие были замечены глобальные и нереентрантные данные и какие проблемы это сулит?
1. Все еще не вижу причин почему не позволяет - он сохраняет весь контекст как есть и вы имеете возможность вернуться ровно в ту же функцию. Так конечно есть заморочки с оптимизированными переменными (что решаемо) С другой стороны я абсолютно уверен, что бустовцы вполне в курсе что делают все стандартные си-функции и не стали бы городить огород без причины. Найти её - вот задача.
Удалить2. Может быть это было следствием упрощения примеров для целей презентации но мне сильно резало глаза использование в методах класса функций/синглтонов (или это были конструкторы) от планировщика/управляющего объекта. Еще раз надо взглянуть на весь код библиотеки в целом чтобы понять было ли это оправданным и единственно возможным решением.
Также мне не очень понятны были все механизмы телепорта, и множества классов введенных. Опять же - надо посмотреть на всю картину в целом
Какие-то неудобные у блоггера комментарии, нет цитирования. Всё работает со скрипом и перекидывая рандомно фокус. Кто-нибудь знает, можно к Блоггеру прикрутить Google+ комментарии?
ОтветитьУдалить