[Python-de] Threading *und* zweimal Forken (Daemon)

Ralph Aichinger ralph at pangea.at
Mi Dez 5 16:35:53 CET 2012


Bitte habt Geduld mit mir, ich bin Python-Newbie, und
kenn mich auch sonst programmiertechnisch nicht so gut 
aus, das vorweg.

Ich möchte in einem Python-Skript (Python, weil es da ein
paar gute Libraries für das was ich machen möchte gibt, 
nicht weil ich mich da gut auskenne) einen Hintergrundprozeß
realisieren, der beim Systemstart gestartet wird, und der
einige Sensoren über eine serielle Schnittstelle ausliest,
ein paar Zeichen an ein seriell angehängtes Display ausgibt,
und auch sonst noch einiges macht (z.B. Logging über
rrdtool). 

Als Vordergrundskript habe ich das aus diversen 
Funstücken und Libraries schon brauchbar zusammengestöpselt,
wobei ich anhand eines gefundenen Beispiels das Auslesen der
seriellen Schnittstelle mit Threading realisiert habe:
Ein Thread liest die serielle Schnittstelle aus, und speichert
den letzten Datensatz in einer globalen Variable, die im 
Haupt-Thread ausgelesen und z.B. per RRDtool geloggt wird.

Das entscheidende Schnipsel (das ich aus einem Beispiel
übernommen habe), das dieses Auslesen übernimmt, das sieht
so aus:

from threading import Thread

[...]

def receiving(ser):
    global last_received
    buffer=''
    while True:
        buffer = buffer + ser.read(256)
        if '\n' in buffer:
            lines = buffer.split('\n')
            last_received = lines[-2]
            buffer = lines[-1]

Thread(target=receiving, args=(ser,)).start()

nach:
http://stackoverflow.com/questions/1093598/pyserial-how-to-read-the-last-line-sent-from-a-serial-device

Das funktioniert bis jetzt scheinbar zuverlässig als Skript
im Vordergrund. 

Würde aus eurer Sicht etwas dagegen zu sprechen, das nach
diesem Kochrezept von Sander Marechal in einen Daemon zu verwandeln:

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

Würde ich da einfach mein ganzes Hauptprogramm des Skripts, und 
die Zeile die den Thread startet in die Funktion "run" stopfen?
Geht das prinzipiell? Oder ist das ein Problem, wenn man das
zweimalige Forken mit Multithreading kombiniert?

TIA

/ralph -- ja, ich will das besser verstehen, aber einstweilen will
          ich mal einen laufenden Prototypen haben, den ich nicht
          dauernd mit "nohup" starten muß.


Mehr Informationen über die Mailingliste python-de