Как Вы реализовали бы подобный Erlang, отправляют и получают в C++?

Может быть, слишком поздно. Но этот метод очень простой и простой






  
    

    

5 ответов

Одна из важных вещей о erlang - то, как функции используются для создания устойчивых систем.

send/recieve модель без совместных использований, и явно копирование. Сами процессы являются легкими потоками.

Если бы Вы действительно требовали устойчивых свойств erlang модели, то Вы были бы лучшими для использования реальных процессов и IPC, а не потоков.

Если Вы хотите устойчивую передачу сообщений, хотя можно закончить тем, что желали сериализировать и десериализовать содержание. Особенно с безопасностью типов.

Сопоставление с образцом в C++ не всегда симпатично, но будет хороший шаблон для этого - Вы закончите тем, что создали объект диспетчера, который использует некоторую форму полиморфизма для получения то, что Вы хотите.

Хотя, если Вы не осторожны, Вы заканчиваете с xml по каналам :)

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

Проблема о перереализации частей, Вы, не получит хорошую связную библиотеку и решение. Решения, которые Вы имеете уже, больше не очень напоминают C++.

4
ответ дан 3 December 2019 в 18:37
поделиться

Что касается модели Actor, существуют существующие реализации как ACT ++ и Theron, но я ничего не мог найти кроме статей о первом, и последний является однопоточным только.

Как автор Theron, мне было любопытно, почему Вы полагаете, что это является однопоточным?

Лично, я реализовал поточную обработку использования агентов и ориентированную на многопотоковое исполнение очередь сообщений

Это - то, как Theron реализована..:-)

Пепел

11
ответ дан 3 December 2019 в 18:37
поделиться

В настоящее время я реализую библиотеку акторов для C ++ под названием «acedia» (в Google пока ничего об этом нет. ), который использует «сопоставление типов». Библиотека - это проект моей магистерской диссертации, и с ее помощью вы можете отправлять актеру любые данные.

Небольшой фрагмент:

recipient.send(23, 12.23f);

А на стороне получателя вы можете либо проанализировать полученное сообщение следующим образом:

Message msg = receive();
if (msg.match<int, float>() { ... }

... или вы можете определить набор правил, который вызывает функцию или метод для вас:

void doSomething(int, float);

InvokeRuleSet irs;
irs.add(on<int, float>() >> doSomething);
receiveAndInvoke(irs);

Также возможно сопоставление обоих на тип и значение:

Message msg = receive();
if (msg.match<int, float>(42, WILDCARD) { ... }
else if (msg.match<int, float>() { ... }

Константа «WILDCARD» означает, что будет принято любое значение. Не передавать аргументы равно установить для всех аргументов значение "WILDCARD"; это означает, что вы хотите только сопоставить типы.

Это, безусловно, небольшой фрагмент. Также вы можете использовать «case-классы», как в Scala. Они сравнимы с "атомикой" в эрланге. Вот более подробный пример:

ACEDIA_DECLARE_CASE_CLASS(ShutdownMessage)
ACEDIA_DECLARE_CASE_CLASS(Event1)
ACEDIA_DECLARE_CASE_CLASS(Event2)

Чтобы реагировать на определенные классы case, вы можете написать актера следующим образом:

class SomeActor : public Actor
{

  void shutdown() { done = true; }
  void handleEvent1();
  void handleEvent1();

  public:

    SomeActor() : done(false) { }

    virtual void act()
    {
      InvokeRuleSet irs;
      irs
        .add(on<ShutdownMessage>() >> method(&SomeActor::shutdown))
        .add(on<Event1>() >> method(&SomeActor::handleEvent1))
        .add(on<Event2>() >> method(&SomeActor::handleEvent2))
      ;
      while (!done) receiveAndInvoke(irs);
    }

};

Чтобы создать нового актера и запустить его, все, что вам нужно написать, это:

Acedia::spawn<SomeActor>();

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

Ваш вопрос задан недавно, но если он вам интересен: дайте мне знать! :)

4
ответ дан 3 December 2019 в 18:37
поделиться

Мне определенно было бы интересно взглянуть на вашу библиотеку "acedia" и я хотел бы помочь всем, чем мог бы. В Erlang есть несколько замечательных конструкций, и C ++ определенно выиграет от такой библиотеки.

0
ответ дан 3 December 2019 в 18:37
поделиться

Сегодня я разместил библиотеку на sourceforge: https://sourceforge.net/projects/acedia/

Как я уже говорил, это ранний выпуск. Но не стесняйтесь критиковать это!

0
ответ дан 3 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: