[Python-de] Thread's als Zombies (bzw. cmd)

Olaf 'Rübezahl' Radicke olaf_rad at gmx.de
Mit Mar 31 10:38:28 CEST 2004


On Wednesday 31 March 2004 06:24, Olaf 'Rübezahl' Radicke wrote:
> On Tuesday 30 March 2004 19:43, Hartmut Goebel wrote:
> > Olaf 'Rübezahl' Radicke wrote:
> > > Jetzt habe ich mich erst mal damit beholfen, selber die
> > > __del__ Funktionen aufzurufen bevor ich sys.exit() aufrufe.
> > > Aber ich glaube das dass so nicht gedacht war.
> >
> > Die Doku sagt dazu:
> > """It is not guaranteed that __del__() methods are called for objects
> > that still exist when the interpreter exits."""
> >
> > Dafür empfiehlt sich wohl die Verwendungs des Moduls 'atexit'.
>
> Funktioniert bei Shift-D aber auch nicht.
>
> Aber der Ärger scheint erst anzufangen... Ich habe festgestellt,
> das meine Thread's als Zombies nach Programmende weiter laufen.
>
> :-(. Ich weis nicht ob das auch mit dem cmd-Modul zu tun hat.

Beim studieren des cmd-Moduls habe eine (recht komplizierte) Lösung gefunden:

1.) Habe ich die Loop-Funktion überladen und wie volgt modifiziert:


    def cmdloop(self, intro=None):
        """Repeatedly issue a prompt, accept input, parse an initial prefix
        off the received input, and dispatch to action methods, passing them
        the remainder of the line as argument.

        """

        self.preloop()
        if intro is not None:
            self.intro = intro
        if self.intro:
            print self.intro
        stop = None
        while not stop:
            if self.cmdqueue:
                line = self.cmdqueue[0]
                del self.cmdqueue[0]
            else:
                if self.use_rawinput:
# ORIGINAL-CODE:
#                    try:
#                        line = raw_input(self.prompt)
#                    except EOFError:
#                        line = 'EOF'
# MODIFIKATION-BEGIN
                    try:
                        line = raw_input(self.prompt)
			if line == "q" or "quit":
				self.postloop()
				break
                    except :
                        self.postloop()
			break
# MODIFIKATION-END
                else:
                    sys.stdout.write(self.prompt)
                    sys.stdout.flush()
                    line = sys.stdin.readline()
                    if not len(line):
                        line = 'EOF'
                    else:
                        line = line[:-1] # chop \n
            line = self.precmd(line)
            stop = self.onecmd(line)
            stop = self.postcmd(stop, line)
        self.postloop()

2.) Lasse ich jetz mein Thread (der auch eine Endlosschleife ist)
in regelmäsigen Abständen einen Wert prüfen in einen Objekt,
der sich verändert, wenn das Programm verändert wird. Geschieht
das, wird die Endlosschleife verlassen und der Thread beendet
sich geordnet.

3.) In der postloop-Funktion ist ein Befehl, der den Wert verändert
der von Thread geprüft wird. 

Auf diese weise sind alle Endlosschleifen beseitigt worden.

MfG
Olaf