2010-01-05 3 views
14

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

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

Спасибо

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

+1

+1 для питона + солнечной энергии. Потрясающие. – gahooa

+1

Можете ли вы прокомментировать, как часто изменяются данные и как часто нужно обновлять потребителей? Эта информация поможет выбрать наилучший подход. – gahooa

+0

Некоторые значения данных могут меняться два раза в секунду, а некоторые - редко. Похоже, что некоторые из других процессов могут быть Java, поэтому подход сокетов выглядит лучше всего. Я думаю, что я попытаюсь что-то сделать, когда клиент (потребитель) регистрирует интерес к определенному значению (например, ток двигателя, статус коммутатора, скорость ветра и т. Д.), И сервер отправляет клиенту обновление при изменении значения. Клиент может также запросить изменение состояния для цифровых выходов. – RyanN

ответ

8

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

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

+0

Это то, что я думал (UD, или TCP-сокеты). Даже просто создание FIFO на unix. – richo

4

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

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

See also the ramfs docs.

2

Согласно Wikipedia article about the mmap system call, содержимое обновленных изображений записано на диск при обновлении.

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

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

0

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

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

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

Смежные вопросы