Nicht auslagerbarer Speicher wächst beständig

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Forumfreunde

Das Problem verhält sich bei mir absolut unberechenbar. Einmal scheint es auf dem Performance-Monitor als wäre das Problem nicht vorhanden ca. 10 Min stabil. Ein anderes mal verhält es sich wie ein JoJo. Der Speicherverbrauch steigt langsam an ca. 500kB springt da schnell wieder zurück. Sieht fast so aus als ob hier der Python Garbage-Collector zyklisch ein Säuberung vornimmt. Im Extremfall kommt es sogar zu einer Exception.
Das ganze könnte man als 'Russisches Roulette' bezeichnen. :D

Übrigens die Version von 'yipyip' arbeite auch bei mir stabil.

Gruss wuf :wink:
Zuletzt geändert von wuf am Montag 1. Dezember 2008, 14:14, insgesamt 1-mal geändert.
Take it easy Mates!
lunar

DasIch hat geschrieben:
BlackJack hat geschrieben:@DasIch: Da finde ich meinen Beitrag jetzt aber unangebracht auf Tkinter verkürzt.
Vielleicht ist er unangebracht verkürzt, kein vielleicht sondern Tatsache ist dass die Qt Variante bei mir dass Verhalten nicht aufweist.
Qt4 verwaltet den Speicher nicht über den Python-GC, sondern über einen eigenen, deterministischen Objektbaum, der Objekte basierend auf Vater-Kind-Verhältnissen zwischen Objekten verwaltet und bereinigt. Das Verhalten von Qt4 in dieser Situation sagt gar nichts über das Verhalten von Tkinter aus.

Im Übrigen ist dein Beispiel ebenso schlecht wie das gepostete Tkinter-Beispiel. Auch in Qt4 sind GUI-Zugriffe aus anderen Threads nicht gut, der kanonische Weg zum Multithreading ist die Nutzung von QtCore.QThread, der ein eigenes Signal auslöst, welches dann mit einem Slot eines Widgets verbunden werden kann. Im Gegensatz zu einfachen Methodenaufrufen sind Signale nämlich threadsicher.
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Anscheinend lag es an der THREAD-Lösung, weshalb der Speicher beständig anstieg.
Mit dieser Lösungsvariante bleibt mein Speicher stabil.

Code: Alles auswählen

import Tkinter as tk
from itertools import count


def start_counter(label,label1,label2):
     counter = count(1)
     def update_func():
         label.config(text=str(counter.next()))
         label1.config(text=str(counter.next()+20))
         label2.config(text=str(counter.next()+40))
         label2.after(10, update_func)
     update_func()


def main():
     root = tk.Tk()
     label = tk.Label(root)
     label.pack()
     label1 = tk.Label(root)
     label1.pack()
     label2 = tk.Label(root)
     label2.pack()

     start_counter(label,label1,label2)
     button = tk.Button(root, text='Beenden', command=root.quit)
     button.pack()
     #label.after(1000,main())
     root.mainloop()


if __name__ == '__main__':
    main()
Antworten