Daemonen und Threads

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
anderl
User
Beiträge: 3
Registriert: Mittwoch 16. November 2005, 00:37

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was spricht dagegen, den Prozess von der Shell zu trennen?

Code: Alles auswählen

leonidas@arktur:~$ python programm.py &
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
anderl
User
Beiträge: 3
Registriert: Mittwoch 16. November 2005, 00:37

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
Zuletzt geändert von anderl am Mittwoch 16. November 2005, 12:58, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 &
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
anderl
User
Beiträge: 3
Registriert: Mittwoch 16. November 2005, 00:37

Hi,

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

cu


anderl :)
Antworten