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

Diez Roggisch deets at web.de
Mi Dez 5 18:08:01 CET 2012


On 12/5/12 4:35 PM, "Ralph Aichinger" <ralph at pangea.at> wrote:

>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-l
>ine-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?


Kurz: ja und nein. Alles in ein Skript spricht nix gegen, du solltest -
gerade bei forks - nichts auf module-Ebene machen, sondern klare
Funktionen haben.

Denn sonst kommt die eine Hälfte vorm fork, die andere danach und soŠ

Und nein,  threading und forking kommen sich nicht in die Quere.

Diez




Mehr Informationen über die Mailingliste python-de