Threading *und* zweimal Forken (Daemon)

05/12/2012 - 16:35 von Ralph Aichinger | Report spam
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 '' in buffer:
lines = buffer.split('')
last_received = lines[-2]
buffer = lines[-1]

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

nach:
http://stackoverflow.com/questions/...ial-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/...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ß.
 

Lesen sie die antworten

#1 Christian Heimes
05/12/2012 - 18:23 | Warnen spam
Am 05.12.2012 18:08, schrieb Diez Roggisch:
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.



Leider ist das so nicht richtig. fork und threads sollte man nur mit
vorsicht mischen, weil man leicht dead locks erzeugen kann. Außerdem
làuft im Child nur noch der Prozess, der fork() aufgerufen hat.

Ich empfehle folgendes Vorgehen:

* erst alle benötigten Module importieren
* dann double fork zum Dàmonisieren
* erst zum Schluss die Geràte öffnen und Threads starten

Christian

Ähnliche fragen