Отключение цикла While True в определенном потоке определенного объекта модели django
Я уже сломал голову и изнасиловал 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 тем самым закрыть поток? Или просто убить поток мне все равно как это остановится. Что я пробовал:
- threading.Event() в init - не работает так как при инициализации (то есть при обращении при функции delete()) он всегда создается новый
- threading.Event() в атрибут класса - не работает так как убивает все потоки
- Просто флаг True/False тоже не работает так как при обращении к классу он его переопределит
Если есть какие-то другие варианты подобного функционала, то подскажите пожалуйста, сам я в django и вообще в программировании новичок. Может Celery может организовать подобное более грамотно? До этого еще пробовал создавать service файлы в со скриптами на каждый url, мне показалось это слишком костыльно и в будущем нерасширяемо, но работало.