Найти - Пользователи
Полная версия: Необъяснимая утечка ОЗУ-памяти при работе программы
Начало » Python для новичков » Необъяснимая утечка ОЗУ-памяти при работе программы
1
Olezhka
Здравствуйте! Нужна помощь! Написал простейшие цифровые часы на базе прозрачного окна “tkinter”. В основе программы лежит зацикленная сама на себя (самозацикленная) функция “tick”. Вот она и сопутствующие ей глобальные переменные:
 from threading import Timer
from datetime import datetime
sep = ' : '
quit_sys = 0
hour = datetime.now().hour
minute = datetime.now().minute
def tick():
    global sep
    global out_clock
    global quit_sys
    global minute
    global hour
    if quit_sys == 0:
        if round(datetime.now().second) != 0:
            if sep == ' : ':
                out_clock = out_clock.replace(sep, '   ', 1)
                text_clock.delete(1.0, END)
                text_clock.insert(1.0, out_clock, 'clock')
                sep = '   '
            else:
                out_clock = out_clock.replace(sep, ' : ')
                text_clock.delete(1.0, END)
                text_clock.insert(1.0, out_clock, 'clock')
                sep = ' : '
        else:
            minute = datetime.now().minute
            hour = datetime.now().hour
            check_zero()
            if minute == 0 and hour == 0:
                day = datetime.now().day
                mounth = mounts_dict[datetime.now().month]
                year = datetime.now().year
                day_week = week_dict[datetime.now().weekday()]
                out_calend = f"{day} {mounth} {year}\n{day_week}"
                text_calendar.delete(1.0, END)
                text_calendar.insert(1.0, out_calend, 'clock')
                out_clock = f"{hour}{sep}{minute}"
                text_clock.delete(1.0, END)
                text_clock.insert(1.0, out_clock, 'clock')
            else:
                out_clock = f"{hour}{sep}{minute}"
                text_clock.delete(1.0, END)
                text_clock.insert(1.0, out_clock, 'clock')
                
        Timer(1, tick).start()

Зациклил я ее с помощью метода “Timer” из модуля “threading”. Возможно, я не прав. Возможно, надо было юзать метод “root.after”, а не “Timer”. Но в любом случае я не понимаю, откуда ноги растут? Почему каждую секунду нарастает объем используемой программой ОЗУ? Это ведь так можно нахулиганить и написать вирь, как писали в старину далекую наши деды-программисты, который за 10 секунд сожрет всю ОЗУ компа и вызовет ее переполнение! Но я так хулиганить не собираюсь. Мне просто интересно, шо такое творится в моем коде? Вот почти АСМР видео демонстрация того, как процесс “python.exe” с моими часами, аппетитно почавкивая, кушает ОЗУ:
Youtube
Почти 2Гб ОЗУ он скушал у меня за сутки работы.
Заранее Вам спасибо за помощь!

xam1816
Olezhka
Почему каждую секунду нарастает объем используемой программой ОЗУ?
что нибудь читал про потоки?
Olezhka
xam1816
Нет. Ты лучше скажи, использование “root.after” вместо “Timer” решит проблему?
xam1816
проверь
  
import tkinter as tk
import datetime
def show_time():
    t = datetime.datetime.now()
    sv.set(f'{t.hour}:{t.minute:02}:{t.second:02}')
    root.after(1000, show_time)
root = tk.Tk()
sv = tk.StringVar()
lbl = tk.Label(textvariable=sv, font='Arial 32 bold')
lbl.pack()
show_time()
root.mainloop()
Olezhka
xam1816
import tkinter as tk
import datetime
def show_time():
t = datetime.datetime.now()
sv.set(f'{t.hour}:{t.minute:02}:{t.second:02}')
root.after(1000, show_time)
root = tk.Tk()
sv = tk.StringVar()
lbl = tk.Label(textvariable=sv, font='Arial 32 bold')
lbl.pack()
show_time()
root.mainloop()
Спасибо! А что такое “:02” в минутах и секундах? И почему метод “Timer” из “threading” так жрал память?
xam1816
Olezhka
И почему метод “Timer” из “threading” так жрал память?
 Timer(1, tick).start()
наверное каждую секунду запускалась функция в новом потоке и оставалась там висеть.
Olezhka
А что такое “:02”
читай про форматирование строк

чтобы подобных вопросов не возникало, изучи базовые алгоритмы, переменные,работа со списками, словарями, множествами, кортежами, работа со строками, работа с временем, циклы, функции, файлы и тд.. - все то что тебе кажется простым, скучным и банальным.Прикол в том, что программы из них и состоят и не зная разных нюансов с ними, ничего стоящего не напишешь.Как пример простенькие часики, которые сжирают память. Ты решай здесь задачи, которые просят новички, так узнаешь о своих возможностях.
А если думаешь вообще заняться программированием, как основной деятельностью, то должен понимать, что нейросеть через год будет лучше писать программы чем ты и я и многих среднячков, так что на рынке нужны будут реально шарящие программисты
Olezhka
xam1816
Ясно! Спасибо за ответ!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB