Доклад «Конкурентные паттерны из Go на Ruby» на BRUG 2016

An illustrated banner with the text "Belarus Ruby User Group", featuring a stylized person with a headset microphone, gesturing with their hands, against an abstract background. An illustrated banner with the text "Belarus Ruby User Group", featuring a stylized person with a headset microphone, gesturing with their hands, against an abstract background.

Традиционная модель многопоточности (обычно используемая в java, c++, python) требует от программиста налаживать коммуникацию между потоками через общую память. В этом случае доступ к общей памяти ограничивается локами (thread-safe структурами данных), которые не позволят изменять данные двум потокам одновременно.

Язык Go предлагает интересную концепцию структурирования конкурентных приложений. В качестве примитивов в языке встроены go-рутины и каналы. Вместо явного использования локов для доступа к данным, go предлагает использовать каналы для обмена ссылками на данные. Тем самым обеспечивается доступ только одной go-рутины к данным в этот момент времени.

Авторы библиотеки concurrent-ruby проделали огромную работу и собрали лучшие практики и паттерны из различных языков (Erlang, Clojure, Scala, Haskell, F#, C#, Java), касающиеся конкурентности. В этом докладе мы рассмотрим некоторые паттерны, которые появились именно благодаря языку go, его примитивам и концепции "Share by communicating" в имплементации на ruby.