Używam najnowszej wersji instalatora Py-TK All-in-One (2.24.2) dla Pythona 2.7, który obejmuje Kair 1.10.8, Pango 1.29.4 , PyGTK 2.24.0 i PyGobject 2.28.3 (myślę).Praca nad dużym wyciekiem pamięci w GTK przy odświeżaniu etykiety
Poniższe przecieki kod ~ 55 MB pamięci:
import gtk
window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
label.set_markup('Leaking memory!')
while gtk.events_pending():
gtk.main_iteration()
Uwaga: dla pętli w moim skrypcie testowym tylko tak mogłem zobaczyć wzrost zużycia pamięci w Menedżerze zadań. Zasadniczo chodzi o to, co dzieje się w mojej prawdziwej aplikacji, z wyjątkiem tego, że tekst etykiety zmienia się co najmniej raz na sekundę, a nie tylko jest przerysowywany z tym samym tekstem za każdym razem.
Linia problemu to label.set_markup()
, która przecieka około 0,5kB na połączenie, więc podejrzewam, że problem jest gdzieś w GTK lub Kairu. Jest to prawdopodobnie this bug (685959), jak zauważył komentator.
Próbowałem użyć funkcji objgraph, aby zobaczyć, czy jakieś dodatkowe obiekty Pythona wyświetlają się proporcjonalnie do liczby wywołań do gtk.Label.set_markup()
, ale nie ma nadmiarowych obiektów. Wynika z tego, że połączenia z gc.collect()
nie pomagają, a ja starałem się to upewnić. Python nie wydaje się być świadomy obiektów, które są odpowiedzialne za zużycie pamięci.
Jak znaleźć ten wyciek pamięci i/lub obejść go? Potrzebuję używać znaczników do stylu tekstu dla tej aplikacji, ale próbowałem użyć gtk.Label.set_text()
jako obejścia problemu i również wyciekam z pamięci.
Należy zauważyć, że ta aplikacja jest przeznaczona dla systemu Windows, więc użycie PyGObject do pobrania GTK 3 nie jest możliwe - introspekcja GObject to nadal niedostępne w systemie Windows.
Czy to wcięcie poprawny? Używasz gtk.main_iteration() tak długo, jak istnieją zdarzenia po każdym ustawieniu etykiety? – pcurry
Tak, to jest właściwy sposób, aby to zrobić. To w zasadzie zamienia pętlę główną na drugą. –
@ Series8217 Do czego służy pętla for? – jadkik94