Seite 1 von 1

Daemonen und Threads

Verfasst: Mittwoch 16. November 2005, 00:53
von anderl
Hallo,

ich habe ein Problem mit Threads und Daemons.

Grundidee:

Eine daemonisierte Prozess soll Threads starten, welche dann im Hintergrund Informationen sammeln und diese in Dateien speichern.


Lösungsansätze:

1. nach den Python Cookbook Daemon erzeugen und Thread starten
2. Mainthread bereits als Daemon starten


Problem:

Sobald the Threads daemonisiert sind oder vom Daemon aus gestartet werden, passiert innerhalb der Threads scheinbar nichts mehr. Mit ps -x auch nicht mehr auffindbar.


Testbeispiel:

Starte folgenden Code NICHT daemonisiert:

Code: Alles auswählen

import threading, os, sys

class TestThread(threading.Thread):
    '''
    This class is responsible for starting the ClientThreads within a certain interval.
    '''
    def __init__(self):
        '''
        Constructor
        '''

        threading.Thread.__init__(self)
        
        
    def run(self):
        '''
        overwriting the standard run method
        '''
	file_fd = open("test_damon.txt", 'w')
	file_fd.close()
	file_fd = file("test_damon.txt", 'r+')
        z = 0
        while(z<10):
            
            asdf = "ich bin der böse thread\n"
            print asdf
            file_fd.seek(0,2)
            file_fd.writelines(asdf)
            time.sleep(1)
            z += 1
           
        file_fd.close()

if __name__ == '__main__':
        workerthread = TestThread()
        workerthread.setName("workerthreadDaemon")
        #workerthread.setDaemon(True)
        workerthread.start()
				
        sys.exit(0)
Datei wird geöffnet und geschrieben. Wird jedoch die Option .setDaemon(True) gesetzt, passiert nichts mehr.

Warum nicht? Übersehe ich hier eine wichtige Sache?

Kann mir jemand helfen oder erklären wo das Problem liegt?

Ich benutzt Python 2.2.3 und SuSE 9.3.

Vielen Dank !


Anderl

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Mittwoch 16. November 2005, 12:25
von Leonidas
Was spricht dagegen, den Prozess von der Shell zu trennen?

Code: Alles auswählen

leonidas@arktur:~$ python programm.py &

Verfasst: Mittwoch 16. November 2005, 12:50
von anderl
Hi,

danke für die Idee, aber wenn ich "&" benutze und die Shell schließe, wird auch der Prozess beendet und ich will einen Daemon der ja dann unter dem init Prozess läuft.

Offensichtlich funktioniert dies mit der Option .setDaemon nicht.
http://aspn.activestate.com/ASPN/docs/A ... jects.html

Man muß wohl letztlich doch zwei mal forken und sicherstellen, das die Deskriptoren entsprechen geschlossen oder umgesetzt werden.

Beispiel:

http://aspn.activestate.com/ASPN/Cookbo ... cipe/66012

cu


anderl

Verfasst: Mittwoch 16. November 2005, 12:55
von Leonidas
anderl hat geschrieben:Man muß wohl letztlich doch zwei mal forken und sicherstellen, das die Deskriptoren entsprechen geschlossen oder umgesetzt werden.
Das ist eine möglichkeit, jedoch:
anderl hat geschrieben:danke für die Idee, aber wenn "ich" & benutze und die Shell schließe, wird auch der Prozess beendet und ich will einen Daemon der ja dann unter dem init Prozess läuft.
Dafür kannst du nohup benutzen, dann laufen die Programme auch weiter wenn deine Shell geschlossen wird:

Code: Alles auswählen

leonidas@arktur:~$ nohup python programm.py &

Verfasst: Mittwoch 16. November 2005, 13:11
von anderl
Hi,

danke für deine Idee :!: , werde ich mit in meine Überlegungen einbeziehen.

cu


anderl :)