Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 28, 2022 18:15:23

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

Здравствуйте! Нужна помощь! Написал простейшие цифровые часы на базе прозрачного окна “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Гб ОЗУ он скушал у меня за сутки работы.
Заранее Вам спасибо за помощь!

Отредактировано Olezhka (Дек. 28, 2022 18:47:28)

Офлайн

#2 Дек. 28, 2022 19:52:28

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

Olezhka
Почему каждую секунду нарастает объем используемой программой ОЗУ?
что нибудь читал про потоки?

Офлайн

#3 Дек. 29, 2022 00:32:08

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

xam1816
Нет. Ты лучше скажи, использование “root.after” вместо “Timer” решит проблему?

Офлайн

#4 Дек. 29, 2022 15:41:05

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

проверь

  
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()

Офлайн

#5 Дек. 29, 2022 19:07:37

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

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” так жрал память?

Офлайн

#6 Дек. 29, 2022 21:28:00

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

Olezhka
И почему метод “Timer” из “threading” так жрал память?
 Timer(1, tick).start()
наверное каждую секунду запускалась функция в новом потоке и оставалась там висеть.
Olezhka
А что такое “:02”
читай про форматирование строк

чтобы подобных вопросов не возникало, изучи базовые алгоритмы, переменные,работа со списками, словарями, множествами, кортежами, работа со строками, работа с временем, циклы, функции, файлы и тд.. - все то что тебе кажется простым, скучным и банальным.Прикол в том, что программы из них и состоят и не зная разных нюансов с ними, ничего стоящего не напишешь.Как пример простенькие часики, которые сжирают память. Ты решай здесь задачи, которые просят новички, так узнаешь о своих возможностях.
А если думаешь вообще заняться программированием, как основной деятельностью, то должен понимать, что нейросеть через год будет лучше писать программы чем ты и я и многих среднячков, так что на рынке нужны будут реально шарящие программисты

Офлайн

#7 Дек. 29, 2022 22:48:35

Olezhka
Зарегистрирован: 2022-12-13
Сообщения: 118
Репутация: +  0  -
Профиль   Отправить e-mail  

Необъяснимая утечка ОЗУ-памяти при работе программы

xam1816
Ясно! Спасибо за ответ!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version