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

StackOverflow https://stackoverflow.com/questions/2006624

Вопрос

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

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

Спасибо

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

Это было полезно?

Решение

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

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

Другие советы

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

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

См. также документацию ramfs..

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top