2010-01-05 13 views
14

Helllo, Vorrei condividere piccole quantità di dati (< 1K) tra python e processi. I dati sono fisici IO/104 dati IO che cambiano rapidamente e spesso (24x7x365). Ci sarà un singolo "server" che scrive i dati e più client ne leggono le parti. Il sistema su cui viene eseguito utilizza la memoria flash (scheda CF) anziché un disco rigido, quindi sono preoccupato di utilizzare la memoria flash con uno schema basato su file. Mi piacerebbe anche usare meno energia (tempo del processore) dato che siamo alimentati al 100% con energia solare.Come condividere i dati tra i processi python senza scrivere sul disco

  • Questa è una preoccupazione valida? Potremmo eventualmente cambiare la scheda CF in un SSD.
  • La modifica di un valore utilizzando mmap scrive fisicamente i dati su disco o si tratta di un file virtuale?
  • Opereremo su Debian, quindi forse POSIX IPC per il modulo python è la soluzione migliore. Qualcuno l'ha usato?
  • Qualcuno ha provato il modulo Python Object Sharing (POSH)? Sembra promettente a prima vista, ma è in "Alpha" e non sembra essere attivamente sviluppato.

Thank You

UPDATE: Abbiamo rallentato la velocità di aggiornamento dei dati massima di circa 10 Hz, ma più tipicamente 1 Hz. I client verranno avvisati solo quando un valore cambia piuttosto che a un tasso di aggiornamento costante. Siamo passati a un modello con più server/più client in cui ogni server è specializzato in un determinato tipo di strumento o funzione. Poiché si è scoperto che la maggior parte della programmazione sarebbe stata eseguita dai programmatori Java, abbiamo finito con l'utilizzo di JSON-RPC su TCP. I server verranno scritti in Java, ma spero ancora di scrivere il client principale in Python e sto facendo delle ricerche sulle implementazioni JSON-RPC.

+1

+1 per python + energia solare. Eccezionale. – gahooa

+1

Puoi commentare la frequenza con cui i dati cambiano e quanto spesso devono essere aggiornati i consumatori? Queste informazioni aiuteranno a scegliere l'approccio migliore. – gahooa

+0

Alcuni valori di dati possono cambiare due volte al secondo mentre alcuni cambiano raramente. Sembra che alcuni degli altri processi possano essere Java, quindi un approccio con socket è il migliore. Penso che proverò a fare qualcosa dove un cliente (consumatore) registra il suo interesse in un determinato valore (ad esempio corrente del motore, stato del commutatore, velocità del vento, ecc.) E il server invia al client un aggiornamento ogni volta che il valore cambia. Il cliente può anche richiedere un cambio di stato per le uscite digitali. – RyanN

risposta

8

Un'alternativa alla scrittura dei dati su file nel processo server potrebbe essere quello di scrivere direttamente ai processi client:

socket di dominio Usa UNIX (o socket TCP/IP se i clienti eseguiti su macchine diverse) per la connessione ogni client al server e fare in modo che il server scriva in questi socket. A seconda del particolare modello di elaborazione, la scelta di un client/socket può essere effettuata dal server (ad esempio round-robin) o dai client che segnalano che sono pronti per ulteriori informazioni.

+0

Questo è quello che stavo pensando (UD, o socket TCP). Anche solo creando un FIFO su unix. – richo

4

Creare una partizione ramfs e scrivere a quello. (Puoi usare tmpfs, ma a differenza di tmpfs, ramfs non è scambiato su disco). Tuttavia, poiché ramfs non ha un limite di dimensioni, è necessario fare attenzione a non esaurire la memoria; dal momento che stai scrivendo solo un piccolo frammento di dati, non dovrebbe esserci un problema.

In questo modo, i dati non verranno mai scritti su un disco (nota: li perderai in caso di interruzione dell'alimentazione).

See also the ramfs docs.

2

In base allo Wikipedia article about the mmap system call, il contenuto dei file mappati in memoria viene riscritto sul disco quando viene aggiornato.

Hai esaminato il modulo di multiprocessing (nella libreria standard), in particolare la parte Condivisione tra i processi?

Ramfs come indicato da Piskvor sembra anche una buona soluzione, specialmente quando non tutti i processi sono scritti in Python.

0

Quando si esegue su sistemi flash, assicurarsi che il proprio filesystem sia progettato correttamente per massimizzare la durata della memoria flash (usura livellata). JFFS e, credo, altri sono ora in grado di farlo in modo efficace. Se si utilizza un sistema del genere, non si dovrebbe essere eccessivamente preoccupati dell'uso del flash, ma certamente se si scrive un flusso costante di dati si vorrebbe evitare di farlo sul flash.

L'utilizzo di un filesystem RAM è una buona idea. È ancora meglio evitare i filesystem interamente se il design del sistema ve lo consente. A tal fine si parla di POSH. Non l'ho mai provato, ma abbiamo trovato Pyro ("PYthon Remote Objects") per essere una soluzione elegante ed efficace in alcuni casi simili.

E naturalmente c'è il modulo della libreria standard multiprocessing, che presenta alcune somiglianze in termini di comunicazione tra i processi. Comincerei da lì per qualsiasi nuovo sviluppo in quest'area, e andrei altrove solo se non riuscisse a uscire.

Problemi correlati