вторник, 21 августа 2018 г.

[life.work] В Питере пить? ;)

Отбываю в Питер делать доклад на митапе St. Petersburg C++ User Group. Пробуду в Питере несколько дней. Совмещу приятное с полезным. Слайды же доклада опубликую на SlideShare уже на следующей неделе, после возвращения домой.

Если кто хочет развиртуализироваться, то приходите на митап, благо еще несколько свободных мест осталось. Ну или давайте знать о себе каким-либо другим образом (скажем по почте (eao197 на gmail), которую я постараюсь проверять регулярно).

[prog.c++] RESTinio обновился до версии 0.4.8

У нас очередной релиз. Наша легковесная C++14 библиотека для встраивания асинхронного HTTP/WebSocket сервера в C++ приложения, RESTinio, обновилась до версии 0.4.8. Изменений не так много, но среди них можно выделить одно весьма важное: нотификаторы для операций записи.

Почему нотификаторы важны? Потому что когда фреймворк для вашего же удобства скрывает от вас всю механику операций ввода-вывода, то вы не знаете, когда именно часть вашего ответа клиенту будет записана в сокет. А это знание может потребоваться, если вы отсылаете большой ответ порциями и вам нужно выстроить эти порции в очередь, чтобы отправлять следующую порцию лишь после того, как уйдет предыдущая. Ну вот, скажем, нужно вам отдать 500MiB порциями по 5MiB, как вам это сделать? Отдать RESTinio все эти 500MiB сразу и пускай RESTinio с ними сам разбирается? А что, если вам нужно отдавать по 500MiB не одному клиенту, а сотне клиентов, или тысяче клиентов?

Вот тут-то нотификаторы и будут полезны. Вы пишете очередную порцию в response, затем вызываете flush() и передаете во flush() нотификатор. RESTinio запишет ваши данные и дернет ваш нотификатор когда запись закончится (положительно или отрицательно). И в этом нотификаторе вы сможете инициировать запись следующей порции.

Минималистичный пример использования нотификаторов:

#include <restinio/all.hpp>
#include <iostream>

int main()
{
  restinio::run(
    restinio::on_this_thread<>()
      .port(8080)
      .address("localhost")
      .request_handler([](auto req) {
        return req->create_response()
                 .set_body("Hello, World!")
                 .done( /* Notificator goes here */
                   [](const auto & ec ){
                     std::cout << "Sending response status: " << ec << std::endl;
                   });
      }));

  return 0;
}

Более актуальный пример можно найти в репозитории RESTinio.

В общем, не стесняемся, берем, пробуем, пользуемся, делимся впечатлениями. Любая конструктивная критика, соображения и предложения всячески приветствуются. Так же приветствуются лайки, плюсадынки и решары :) Кому не лень, можно плюсануть соответствующую тему на Reddit-е.