@oo22maxi

Утечка памяти используя Thread и pyglet?

Добрый вечер. Не могу понять в чем проблема, почему увеличивается память каждый раз как запускается следующий mp3 файл?
import threading, pyglet, time

class Player():
    
    def __init__(self):
        super(Player, self).__init__()
        self.sound = False

    def run(self):
        self.sound = pyglet.media.Player()
        self.player_thread = threading.Thread(target=self.playsound)
        self.player_thread.start()

    def playsound(self):
        # Путь к mp3 файлу
        music = pyglet.media.load(r'/home/app/sound.mp3')
        self.sound.queue(music)
        self.sound.play()
        pyglet.app.run()

    def next(self):
        n_thread =  threading.active_count()
        print(f'Thread count: {n_thread}')
        for t in threading.enumerate():
            print(f'Thread Name: {t.name}')
        
        self.sound.delete()
        del self.sound
        pyglet.app.exit()
        del self.player_thread
        self.run()
        

    def exit(self):
        self.sound.delete()
        del self.sound
        self.sound = False
        pyglet.app.exit()


p = Player()

print("Выберите действие")
while True:
    # play - Старт плеера
    # next - Следующий трек
    # stop - Остановка трека
    # exit - Выход из программы
    x = input('play (p) | next (n) | stop (s) | exit:\n')
    if x == 'play' or x == 'p':
        p.run()
    elif x == 'next' or x == 'n':
        p.next()
    elif x == 'stop' or x == 's':
        if p.sound:
            p.exit()
    elif x == 'exit':
        if p.sound:
            p.exit()
        break
    else:
        print("Выберите действие")
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
@oo22maxi Автор вопроса
Нашел решение, нужно было использовать не отдельный поток через threading.Thread, а отдельный процесс через multiprocessing.Process. При воспроизведение следующего трека, процесс закрывается и открывается новый, в результате нет утечки памяти.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MEDIOFF
Python Developer
Не претендую на правдивость, но насколько мне известно дела обстоят так.

Python хранит объекты в пулах, а пулы в аренах, это что бы избежать размазывания данных по памяти, когда python ищет куда запихнуть объект он смотрит на наличие незаполненных арен, и если их нет, то запрашивает ее у системы. В случае если у нас есть свободные арены - выбирает выбирает самую заполненную арену и пишет туда наш объект (опять же что бы данные не размазывать по памяти, а хранить их максимально близко). Когда таким образом заполняется арена, он берет следующую, но прикол в том, что когда мы удаляем большой объект из памяти (а в данном случае mp3 файл может занять у нас сразу всю арену) то python не возвращает эту арену системе, и она остается у программы дальше, отсюда возможно у вас и происходит такое

P.S: вот если интересно видео о работе памяти в python, довольно подробно это объясняется тик
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы