2012-03-19 16 views
18

Devo scrivere un programma daemon che viene eseguito costantemente in background ed esegue alcune semplici operazioni. La logica non è affatto complicata, tuttavia deve essere eseguita per lunghi periodi di tempo ed essere stabile.Scrivere un demone in Python è una buona idea?

Penso che C++ sarebbe una buona scelta per scrivere questo tipo di applicazione, tuttavia sto considerando anche Python dato che è più facile scrivere e testare qualcosa velocemente in esso.

Il problema che ho con Python è che non sono sicuro di come si comporterà il suo ambiente di runtime per lunghi periodi di tempo. Può consumare sempre più memoria a causa di alcune stranezze del GC? Può arrestarsi in modo imprevisto? Non ho mai scritto daemon in Python prima, quindi se qualcuno lo ha fatto, per favore condividi la tua esperienza. Grazie!

+4

Questo potrebbe rivelarsi utile: http://pypi.python.org/pypi/python-daemon/ (mai usato). –

risposta

14

Ho scritto un numero di daemon in Python per la mia ultima azienda. La risposta breve è, funziona bene. Finché il codice stesso non ha una bomba di memoria enorme, non ho mai visto alcun degrado graduale o memoria hogging. Presta attenzione a qualsiasi cosa nell'ambito globale o di classe, perché vivrà, quindi utilizza del in modo più liberale di quanto potresti normalmente. Altrimenti, come ho detto, nessun problema posso segnalare personalmente.

E nel caso ve lo stiate chiedendo, hanno funzionato per mesi e mesi (diciamo 6 mesi in genere) tra i riavvii di routine con zero problemi.

+0

quale libreria hai usato per questi daemon? python-daemon? eseguito come demone? – Zaroth

+0

@Zaroth nessuna libreria, solo una doppia forchetta standard. –

4

Sì, può perdere. Sì, può bloccarsi in modo imprevisto. Tutto può

Direi che è molto più probabile che si perda casualmente in un ambiente con gestione manuale della memoria (ad es. C++) piuttosto che con qualcosa come Python.

Quanto a schiantarsi inaspettatamente, beh, è ​​probabile che un grumo arbitrario di Python potrebbe essere più probabilità di crash inaspettatamente che un grumo arbitraria di Java, in quanto quest'ultimo beneficia di static typing dove si può prendere un intero carico di errori in fase di compilazione , che Python con il suo duck typing e altre forme di flessibilità.

Realisticamente, Python suona una scelta perfettamente ragionevole per ciò che si vuole fare. Dai un'occhiata a qualcosa come Twisted per un motore decente per costruire le cose in giro, o almeno per un'idea di struttura (la tua domanda sembra una specie di incarico scolastico, quindi non sono sicuro di quanta libertà di implementazione tu abbia)

+1

Twisted è davvero più un framework di rete, l'OP non ha mai detto che si trattava di un demone di rete. –

+3

Python è fortemente digitato e anatra digitato – wim

+1

@Chris: Punto giusto, anche se quando penso a Twisted penso più al "event-based" di quanto non faccia il networking, che ritengo sia un buon modello per qualsiasi tipo di demone –

1

Ho scritto molte cose in C/C++ e Perl che sono avviate quando un sistema operativo LINUX box stivali, avviarli utilizzando il rc.d.

Inoltre ho scritto un paio di script java e python che sono stati avviati nello stesso modo in cui ho menzionato sopra, ma avevo bisogno di un piccolo script di shell (file .sh) per avviarli e ho usato rc.5 .

Lascia che ti dica che le tue preoccupazioni riguardo ai loro ambienti di runtime sono completamente valide, dovrai stare attento a quale runlevel utilizzerai ... (solo da rc.2 a rc.5, perché rc.1 e rc.6 sono per il sistema).

Se il runlevel è troppo basso, il runtime python potrebbe non essere attivo nel momento in cui si avvia il programma e potrebbe floppare. ad es .: in un server LAMP MySQL e Apache sono avviati in rc.3 dove la rete è già disponibile.

Penso che la soluzione migliore sia creare il tuo script in python e avviarlo utilizzando un file .sh da rc.5.

Buona fortuna!

+0

Quali sono esattamente i livelli RC.x? – Finglas

+1

Questo potrebbe essere utile: http://www.networkclue.com/os/Linux/run-levels.aspx –

+0

@Finglas Potresti chiedere a http://unix.stackexchange.com –

Problemi correlati