Начинаю изучать библиотеку

22 views
Skip to first unread message

Владимир Иевлев

unread,
Apr 9, 2020, 5:53:27 AM4/9/20
to SObjectizer
Добрый день. Наконец-то пришло время изучить Вашу библиотеку. Сейчас в виртуальной машине идет сборка библиотеки, примеров и тестов. Буду разбираться и попробую понять, какие из многочисленных возможностей лучше подходят для моих задач. Но может быть у Вас найдется время/возможность посоветовать, на что мне следует обратить внимание в первую очередь. Поэтому вкратце опишу свою программу, реализованную на С, которую имею желание переделать на С++ (но в оном языке, мягко говоря, еще плаваю). 

Есть несколько источников, из которых поступают разнородные данные. Это и СОМ-порты, и специализированные платы и ЛВС. Сейчас каждый из этих источников обрабатывается в своем потоке. Любой источник может содержать "мусор", поэтому на первом шаге данные рассматриваются просто как поток байт, которые документируются с привязкой ко времени для последующего анализа. Затем из этого потока выделяются информационные сообщения (которые существенно отличаются друг от друга для разных источников данных), документируются для последующего анализа, уходят на дальнейшую многоступенчатую обработку, а также передаются в ЛВС на соседние компьютеры. В конце-концов результаты этой обработки передаются в GUI для отображения оператору во всей своей красе.

Что мне не нравится в текущей реализации. Программа конечно разбита и на модули, и на потоки, и дополнительно введены таймеры разной длительности, но в целом (положа руку на сердце) можно считать, что все это - один большой кусок .... монолитного кода. Который поддается модернизации крайне неохотно. А делать это приходится достаточно регулярно. Тут и новые требования заказчика, и постоянная модернизация методов обработки данных и внедрение новых "слоев" этой самой обработки. 

Поэтому я "запал" на то, есть возможность достаточно независимые "сущности" реализовать в виде агентов, а вместо "прямого" вызова функций посылать сообщения. До сих пор я просматривал документацию по библиотеке "по диагонали", но успел заметить, что есть разные варианты этих самых сообщений и пока не понимаю, какие именно нужны мне. 

Буду признателен любым подсказкам.

Yauheni Akhotnikau

unread,
Apr 9, 2020, 6:19:54 AM4/9/20
to SObjectizer
Из такого предварительного описания сложно понять, какие именно подсказки вам нужны. Поэтому пока ограничусь несколькими общими словами. А вы можете задавать любые дополнительные вопросы, постараюсь на них оперативно отвечать. Если нужно будет обсудить какие-то вещи, которые нежелательно выносить на всеобщее обозрение, то можно написать мне напрямую на eao197 на гмайле.

Общее ощущение от того, что вы описали таково, что подобная задача должна отлично ложиться как на агентов с асинхронными сообщениями вообще, так и на SObjectizer в частности. Т.к. в SObjectizer-е вы сможете гибко распределять своих агентов по рабочим контекстам с помощью диспетчеров. Скажем, агентов, которые должны на отдельных рабочих нитях опрашивать оборудование можно привязать к отдельным экземплярам one_thread-диспетчеров, либо же к одному общему active_obj-диспетчеру (который каждому агенту автоматически будет выделять отдельную нить). А агентов, которые делают какую-то обработку данных можно разместить на общем thread_pool-диспетчере (или adv_thread_pool-диспетчере). Ну и распространять информацию между агентами вы сможете как в режиме 1-к-1, так и 1-ко-многим.

Что касается типов сообщений, то их в SObjectizer как раз немного. Всего два:

* собственно сообщения с некими данными внутри. Эти сообщения могут быть как отнаследованными от so_5::message_t, так и не отнаследованными (отсылка отнаследованных сообщений может быть несколько эффективнее). Но, в общем, это дело вкуса, а так же возможностей отрефакторить уже имеющийся у вас код;
* сигналы, которые информацию внутри хранить не могут и которые нужны лишь для информирования о том, что какой-то сигнал возник. Вот сигналы должны наследоваться от so_5::signal_t.

В SO-5.5 еще были нюансы с возможностью синхронного взаимодействия между агентами. Но в SO-5.6/5.7 эта штука была серьезнейшим образом переделана и в SO-5.7 синхронное взаимодействие между агентами уже выполняется совсем по-другому (https://github.com/Stiffstream/so5extra/wiki/so5extra-1.4-Synchronous-Interaction).

Возможно, вы уже читали эти статьи, но на всякий случай дам ссылки. Думаю, они могут быть для вас полезны:

https://habr.com/ru/post/332166/ "Имитируем управление устройствами с помощью акторов"
https://habr.com/ru/post/460123/ "A declarative data-processing pipeline on top of actors? Why not?" Эта статья может быть слишком хардкорной, т.к. там навороченные C++ные возможности используются, но в ней рассказывается о том, как можно сделать стадийность обработки информации. И если компактный DSL для описания конвейера обработки данных не нужен, то можно его сделать на агентах без дополнительной шаблонной магии.
Reply all
Reply to author
Forward
0 new messages