Nano Hash - криптовалюты, майнинг, программирование

Простой IPC между C ++ и Python (кросс-платформенный)

У меня есть процесс C ++, работающий в фоновом режиме, который будет нечасто генерировать «события», которые нужно будет поднять процессу Python, запущенному в том же самом ящике.

  • Код на стороне C должен быть как можно более легким.
  • Сторона Python доступна только для чтения.
  • Реализация должна быть кроссплатформенной.
  • Отправляемые данные очень просты.

Какие у меня варианты?

Спасибо


  • На какой ОС работают ваши программы? IPC на основе конвейера очень легко реализовать на Unix-подобных машинах. 02.08.2011
  • сторона C - это опечатка, верно? 08.08.2018

Ответы:


1

zeromq - и ничего больше. кодировать сообщения как строки.

Однако, если вы хотите получить сериализацию из библиотеки, используйте protobuf, он сгенерирует классы для Python и C ++. Вы используете функции SerializeToString () и ParseFromString () на обоих концах, а затем передаете строки через ZeroMq.

Проблема решена, поскольку я сомневаюсь, что любое другое решение будет быстрее, и ни одно другое решение не будет таким простым для подключения и понимания.

Если вы хотите использовать определенные системные примитивы для rpc, такие как именованные каналы в Windows и доменные сокеты Unix в unix, вам следует посмотреть Boost :: ASIO. Однако, если у вас нет (а) опыта работы в сети и (б) очень хорошего понимания C ++, это займет очень много времени.

02.08.2011
  • +1 за несколько вариантов. И отмечая, что protobuf - это только решение для аспекта сериализации. 02.08.2011
  • Я выбрал zeromq, потому что реализация на стороне сервера состоит из 12 строк кода !! Я не люблю брать зависимости, если мне это не нужно, но zeromq - исключение. :) 03.08.2011
  • Да, zeromq разработан именно для вашего случая использования. Это очень примитивно и очень легко понять. Однако его примитивность является надежной, поскольку вы можете реализовать более сложные конструкции обмена сообщениями из нее. В своей работе я решил реализовать свою собственную систему RPC поверх boost: ASIO, поскольку мне нужны были системные примитивы, о которых я упоминал выше. 03.08.2011
  • Zeromq - худший. Я сделал именно это с ZeroMQ и теперь переключаюсь на что-нибудь еще. ZeroMQ вообще не имеет понятия об отказе. Если вы попытаетесь отправить сообщение, и ваш процесс остановится, это будет невозможно сказать. Он просто продолжал бы попытки отправить вечно. Есть много других проблем, при которых сбой полностью непрозрачен, и поэтому повторная попытка также невозможна. 08.09.2018
  • @ ghostbust555 Я давно не работал с zeromq. Никакой концепции отказа, другими словами, стреляй и забывай, в обмене сообщениями нет ничего плохого. Также вы можете построить механику отказа поверх zeromq, если вам это нужно. Сказав, что в наши дни я мог бы склоняться к GRPC, но он имеет довольно тяжелый след зависимости от Python, если я правильно помню. 25.09.2018
  • @HassanSyed Вы правы в том, что вы можете построить обнаружение сбоев поверх, но это становится очень запутанным из-за необходимости делать такие вещи, как прерывание потоков, чтобы уничтожить бесконечные очереди ожидания. Я никогда не находил причины, по которой не нужно получать уведомления о сбое доставки сообщения. Если вы выполняете IPC, а сообщение не может быть отправлено, вы почти всегда хотите кого-то уведомить или возродить слушателя. Я думаю, что отсутствие этой способности значительно снижает полезность любой коммуникационной библиотеки. 26.09.2018

  • 2

    Используйте zeromq, это настолько просто, насколько это возможно.

    02.08.2011
  • Хороший проект, с хорошей документацией. Спасибо, что указали на это! 02.08.2011
  • Выглядит действительно здорово. И он кажется действительно портативным, гибким и быстрым. 02.08.2011

  • 3

    protobuf от Google - отличная библиотека для RPC между программами. Он создает привязки для Python и C ++.

    Если вам нужна распределенная система обмена сообщениями, вы также можете использовать что-то вроде RabbitMQ, zeromq или ActiveMQ. См. этот вопрос для обсуждения библиотек очередей сообщений.

    02.08.2011
  • RabbitMq - это базука по сравнению с ZeroMq, который является мухобойкой;) 02.08.2011
  • OP не уточнил, нужна ли базука, поэтому я представил ту, которая, на мой взгляд, является самой популярной. Я отредактировал свой ответ, включив также zeromq и ActiveMQ, и указал на другой вопрос SO по этой теме. 02.08.2011
  • Я думаю, protobuf - это просто библиотека сериализации для переносимой транспортировки самого сообщения. Кажется, что он не предоставляет никакого механизма для вызовов RPC и IPC. 01.11.2016

  • 4

    Другой вариант - просто вызвать код C из кода Python с помощью модуля ctypes, а не запуск двух программ по отдельности.

    02.08.2011
  • Процесс C - это демон, который все время работает в фоновом режиме. 02.08.2011

  • 5

    Насколько сложны ваши данные? Если это просто, я бы сериализовал его как строку. Если бы он был умеренно сложным, я бы использовал JSON. TCP - хороший межплатформенный транспорт IPC. Поскольку вы говорите, что этот IPC встречается редко, производительность не очень важна, и TCP + JSON будет в порядке.

    02.08.2011

    6

    Для этого можно использовать GRPC от Google.

    09.09.2016

    7

    Я скажу, что вы создаете DLL, которая будет управлять связью между ними. Python загрузит DLL и вызовет метод, такой как getData (), а DLL, в свою очередь, будет связываться с процессом и получать данные. Это не должно быть сложно. Также вы можете использовать XML-файл или базу данных SQLite или любую базу данных для запроса данных. Демон обновит базу данных, а Python продолжит запросы. Может быть поле для указания того, обновлены ли данные в БД демоном, а затем Python запросит. Конечно, это зависит от показателей производительности и точности!

    02.08.2011
  • Потому что я не хочу лететь в Японию за суши, когда я могу взять телефон и доставить его. :) 03.08.2011
  • @Stefano Критика очевидна ... Мой голос против не кроссплатформенного решения (см. Теги). 27.07.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..