Как обмениваться данными между процессами python без записи на диск

Helllo, Я хотел бы поделиться небольшими объемами данных (< 1K) между python и процессами. Данные представляют собой физические данные PC/104 IO, которые быстро и часто меняются (24x7x365). Будет один "сервер", записывающий данные и несколько клиентов, читающих его части. В системе, в которой будет работать, используется флэш-память (CF-карта), а не жесткий диск, поэтому я беспокоюсь о том, чтобы вытащить флеш-память с помощью схемы на основе файлов. Я также хотел бы использовать меньше энергии (процессорное время), поскольку мы на 100% работаем на солнечной энергии.

  • Является ли это серьезным беспокойством? Мы могли бы сменить CF-карту на SSD.
  • Изменяет ли значение с помощью mmap физически записывает данные на диск или это виртуальный файл?
  • Мы будем работать на Debian, поэтому, возможно, POSIX IPC для модуля python - лучшее решение. Кто-нибудь использовал его?
  • Кто-нибудь пробовал модуль Python Object Sharing (POSH)? Он выглядит многообещающим на первый взгляд, но он находится в "Альфе" и, похоже, не активно развивается.

Спасибо

UPDATE: Мы замедляем максимальную скорость обновления данных до 10 Гц, но чаще всего 1 Гц. Клиенты будут уведомляться только в том случае, если значение изменяется, а не с постоянной скоростью обновления. Мы перешли к модели с несколькими серверами/несколькими клиентами, где каждый сервер специализируется на определенном типе инструмента или функции. Поскольку выяснилось, что большинство программ должно было быть сделано программистами Java, мы закончили использование JSON-RPC через TCP. Серверы будут написаны на Java, но я все же надеюсь написать основной клиент в Python и провести исследования JSON-RPC.

Ответ 1

Альтернативой записи данных в файл в серверном процессе может быть прямое обращение к клиентским процессам:

Используйте сокеты домена UNIX (или сокеты TCP/IP, если клиенты запускаются на разных компьютерах) для подключения каждого клиента к серверу и записи сервера в эти сокеты. В зависимости от вашей конкретной модели обработки выбор клиента/сокета может выполняться сервером (например, round-robin) или клиентами, сигнализирующими, что они готовы к большему.

Ответ 2

Создайте раздел ramfs и напишите на него. (Вы можете использовать tmpfs, но в отличие от tmpfs, ramfs не заменяется на диск). Однако, поскольку у ramfs нет ограничения по размеру, вы должны позаботиться о том, чтобы у вас не хватило памяти; так как вы пишете только крошечный бит данных, это не должно быть проблемой.

Таким образом, ваши данные никогда не будут записаны на диск (обратите внимание: вы потеряете их, если сбой питания).

См. также документы ramfs.

Ответ 3

В соответствии с статьей Википедии о системном вызове mmap, содержимое отображаемых файлов памяти записывается на диск при обновлении.

Посмотрели ли вы на модуль многопроцессорности (в стандартной библиотеке) - особенно состояние совместного использования частей между процессами?

Ramfs, о котором упоминал Писквор, также кажется хорошим решением - особенно, когда не все процессы написаны на Python.

Ответ 4

При работе на флэш-системах убедитесь, что ваша файловая система спроектирована правильно, чтобы максимально увеличить срок службы флэш-памяти (выравнивание износа). JFFS, и, я полагаю, другие теперь способны сделать это эффективно. Если вы используете такую ​​систему, вы не должны чрезмерно беспокоиться об использовании вспышки, но, конечно, если вы пишете постоянный поток данных, которые вы хотите избежать, сделайте это на вспышке.

Использование файловой системы RAM - хорошая идея. Еще лучше всего избежать файловых систем, если дизайн системы позволит вам. С этой целью вы упоминаете POSH. Я никогда не пробовал, но мы нашли Pyro ( "PYthon Remote Objects" ), чтобы быть элегантным и эффективным решением в некоторые подобные случаи.

И, конечно, существует стандартный библиотечный модуль multiprocessing, который имеет некоторые сходства в терминах того, как он обменивается данными между процессами. Я бы начал там для каких-либо новых разработок в этой области и отправился в другое место, только если это не получилось.