2010-01-05 7 views
14

Helllo, Me gustaría compartir pequeñas cantidades de datos (< 1K) entre python y procesos. Los datos son físicos pc/104 IO datos que cambian rápidamente y a menudo (24x7x365). Habrá un único "servidor" que escribirá los datos y múltiples clientes que leen partes de él. El sistema en el que se ejecutará utiliza una memoria flash (tarjeta CF) en lugar de un disco duro, por lo que me preocupa el desgaste de la memoria flash con un esquema basado en archivos. También me gustaría usar menos energía (tiempo de procesador) ya que somos 100% de energía solar.Cómo compartir datos entre procesos Python sin escribir en el disco

  • ¿Es esto una preocupación válida? Posiblemente podríamos cambiar la tarjeta CF a una SSD.
  • ¿Cambia físicamente un valor utilizando mmap los datos en el disco o es un archivo virtual?
  • Funcionaremos en Debian, por lo que quizás el POSIX IPC para el módulo python sea la mejor solución. ¿Alguien lo ha usado?
  • ¿Alguien ha probado el módulo Python Object Sharing (POSH)? Parece prometedor a primera vista, pero está en "Alpha" y no parece estar desarrollándose activamente.

Gracias

ACTUALIZACIÓN: Nos frenado el ritmo de actualización de datos máxima de aproximadamente 10 Hz, pero más típicamente de 1 Hz. A los clientes solo se les notificará cuando cambie un valor en lugar de hacerlo a una tasa de actualización constante. Hemos ido a un modelo de servidores múltiples/clientes múltiples donde cada servidor se especializa en cierto tipo de instrumento o función. Dado que resultó que la mayoría de la programación iba a ser realizada por programadores de Java, terminamos usando JSON-RPC sobre TCP. Los servidores estarán escritos en Java pero aún espero escribir el cliente principal en Python y estoy investigando las implementaciones de JSON-RPC.

+1

+1 para python + alimentado por energía solar. Increíble. – gahooa

+1

¿Puede comentar con qué frecuencia cambian los datos y con qué frecuencia deben actualizarse? Esa información ayudará a elegir el mejor enfoque. – gahooa

+0

Algunos valores de datos pueden cambiar dos veces por segundo, mientras que otros cambian raramente. Parece que algunos de los otros procesos pueden ser Java, por lo que un enfoque de sockets se ve mejor. Creo que intentaré hacer algo cuando un cliente (consumidor) registre su interés en cierto valor (por ejemplo, corriente del motor, estado del interruptor, velocidad del viento, etc.) y el servidor envía al cliente una actualización cada vez que cambia el valor. El cliente también puede solicitar un cambio de estado para las salidas digitales. – RyanN

Respuesta

8

Una alternativa a escribir los datos a presentar en el proceso del servidor podría ser escribir directamente a los procesos cliente:

sockets de dominio Uso de UNIX (o sockets TCP/IP si los clientes ejecutan en máquinas diferentes) para conectar cada cliente al servidor, y haga que el servidor escriba en esos sockets. Dependiendo de su modelo particular de procesamiento, el servidor puede elegir un cliente/socket (por ejemplo, round-robin) o que los clientes indiquen que están listos para más.

+0

Esto es lo que estaba pensando (UD o sockets TCP). Incluso acaba de crear un FIFO en Unix. – richo

4

Crea una partición ramfs y escribe eso. (Puede usar tmpfs, pero a diferencia de tmpfs, ramfs no se intercambia en el disco). Sin embargo, como ramfs no tiene un límite de tamaño, debes tener cuidado de que no te quedes sin memoria; ya que solo está escribiendo un poquito de información allí, no debería ser un problema.

De esta manera, sus datos nunca se escribirán en un disco (nota: los perderá si falla la alimentación).

See also the ramfs docs.

2

De acuerdo con Wikipedia article about the mmap system call, el contenido de los archivos mapeados en memoria se vuelven a escribir en el disco cuando se actualiza.

¿Ha mirado el módulo de multiprocesamiento (en la biblioteca estándar), especialmente el estado Compartir parte entre procesos?

Ramfs como se menciona por Piskvor también parece una buena solución, especialmente cuando no todos los procesos están escritos en Python.

0

Cuando se ejecuta en sistemas flash, asegúrese de que su sistema de archivos esté diseñado correctamente para maximizar la vida útil de la memoria flash (nivelación de desgaste). JFFS y, creo, otros ahora son capaces de hacerlo de manera efectiva. Si usa un sistema de este tipo, no debería preocuparse demasiado por el uso del flash, pero ciertamente si está escribiendo un flujo constante de datos, querría evitar hacerlo en el flash.

El uso de un sistema de archivos RAM es una buena idea. Mejor aún es evitar los sistemas de archivos por completo si el diseño del sistema te lo permite. Para ese fin mencionas POSH. Nunca lo he intentado, pero hemos encontrado que Pyro ("objetos remotos PYthon") es una solución elegante y efectiva en algunos casos similares.

Y, por supuesto, está el módulo de la biblioteca estándar multiprocessing, que tiene algunas similitudes en cuanto a la forma en que se comunica entre los procesos. Comenzaría allí por cualquier desarrollo nuevo en esta área, e iré a otro lado solo si no funciona.

Cuestiones relacionadas