Нашлось время и ресурсы запилить новые версии SObjectizer и so5extra.
В SObjectizer-5.7.1 реализовано несколько полезных нововведений и исправлено несколько косяков, которые пока еще не проявлялись.
Одно из самых важных изменений в SObjectizer-5.7.1 -- это возможность назначать лимиты для сообщений по умолчанию:
class demo final : public so_5::agent_t { public: demo(context_t ctx) : so_5::agent_t{ctx + limit_then_drop<msg_A>(100u) + limit_then_abort<msg_B>(10u) // That limit will be used for all other messages. + limit_then_drop<any_unspecified_message>(50u) } {} void so_define_agent() override { // Explicitly defined limit will be used. so_subscribe_self().event([](mhood_t<msg_A> cmd) {...}); // A new limit object will be created for msg_C here. so_subscribe_self().event([](mhood_t<msg_C> cmd) {...}); } }; |
Так что теперь, если агенту нужно обрабатывать 100500 разных сообщений с одинаковыми лимитами, то можно сделать всего одно описание этого общего лимита.
Второе полезное нововведение в SO-5.7.1 -- это шаблонная функция make_agent_ref, которая позволяет гарантировать нужное время жизни указателя на агента, если этот указатель приходится отдавать в какой-нибудь коллбэк:
class io_performer final : public so_5::agent_t { asio::io::tcp::socket connection_; std::array<std::byte, 4096> input_buffer_; void handle_incoming_data(std::size_t bytes_transferred) {...} void on_some_event(mhood_t<some_msg> cmd) { // It's time to read some data. connection_.async_read_some(asio::buffer(input_buffer_), [self=so_5::make_agent_ref(this)] (const asio::error_code & ec, std::size_t bytes_transferred) { if(!ec) self->handle_incoming_data(bytes_transferred); }); } ... }; |
Полный перечень нововведений и изменений в SO-5.7.1 можно найти здесь.
В so5extra-1.4.1 был добавлен новый тип диспетчера: asio_one_thread.
Этот диспетчер использует отдельную рабочую нить, на которой запускается io_context::run и на которой обслуживаются как I/O-операции, так и события привязанных к этому диспетчеру агентов.
По своей логике работы asio_one_thread очень похож на asio_thread_pool диспетчер, но имеет более простую реализацию. И он более удобен в использовании, когда все I/O-операции нужно "прибить" к одному контексту.
На самом деле asio_one_thread-диспетчер в so5extra появился еще месяц назад, но публичных анонсов so5extra-1.4.1 пока не было, т.к. asio_one_thread обкатывался в новой проекте. Вроде бы работает как и задумывалось, так что можно и анонсировать его наличие.
Хочу поблагодарить всех, кто выбрал SObjectizer/so5extra. Ваш интерес к этим проектам является самым важным стимулом для дальнейшего развития SObjectizer-а. А ваша обратная связь позволяет добавлять в SObjectizer/so5extra функциоальность, до который мы сами бы и не дошли. Что делает SObjectizer/so5extra полезными еще большему кругу разработчиков.
Комментариев нет:
Отправить комментарий