Отключение цикла While True в определенном потоке определенного объекта модели django

Рейтинг: 0Ответов: 0Опубликовано: 17.05.2023

Я уже сломал голову и изнасиловал ChatGPT. Подскажите пожалуйста, как правильно в этом коде остановить subprocess (часть неважных переменных я опустил):

class Stream(models.Model):
    url = models.CharField(max_length=264, default='')

    def record(self, url):
        streamlink_command = f'streamlink -Q --hls-segment-threads 3 {url} {quality} -o {rec_dir}{rec_name}'
        while True:
            self.process = subprocess.run(streamlink_command, shell=True)
            time.sleep(30)

    def save(self, *args, **kwargs):
        self.record_thread = threading.Thread(target=self.record, args=(self.url,), name=self.url)
        self.record_thread.start()
        return super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        return super().delete(*args, **kwargs)

Если в двух словах, при добавлении объекта класса из админки запускается постоянный мониторинг в цикле While в отдельном потоке, и если стрим онлайн, он пишется, а если нет то команда пропускается и это повторяется каждые 30 секунд.

Как мне сделать, что бы в момент когда допустим стрим онлайн и соответственно пишется, я мог остановить subprocess в определенном объекте класса и после этого выйти из этого цикла while True тем самым закрыть поток? Или просто убить поток мне все равно как это остановится. Что я пробовал:

  1. threading.Event() в init - не работает так как при инициализации (то есть при обращении при функции delete()) он всегда создается новый
  2. threading.Event() в атрибут класса - не работает так как убивает все потоки
  3. Просто флаг True/False тоже не работает так как при обращении к классу он его переопределит

Если есть какие-то другие варианты подобного функционала, то подскажите пожалуйста, сам я в django и вообще в программировании новичок. Может Celery может организовать подобное более грамотно? До этого еще пробовал создавать service файлы в со скриптами на каждый url, мне показалось это слишком костыльно и в будущем нерасширяемо, но работало.

Ответы

Ответов пока нет.