Потоки в Django с threading

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

У меня есть необходимость запускать поток (далее планирую использовать его как мини-версию крона) при запуске приложения на джанго.

Дело в том, что если я запускаю поток через th.start() то приложение джанго запускает его дважды, что мне не подходит, как и запускать его отдельным приложением. Попробовал дать имя потоку и с помощью threading.enumerate() отследить его так:

def schedule ():
    import time
    while True:
        time.sleep (5)
        print ('Демон работает')

th = threading.Thread (target=schedule, daemon=True, name='schedule')

daemon = False
for name in threading.enumerate():
    print (name.getName()) # Смотрю какие имена вообще есть
    if name.getName() == 'schedule':
        daemon = True
        break

if daemon == True:
    print('Демон еще жив')
else:
    print('Демон запущен')
    th.start()

В моем представлении это должно было сработать, но threading.enumerate() ничего кроме MainThread не видит и условие ниже запускает его дубль. Что я вижу в терминале:

python3 manage.py runserver
MainThread
Демон запущен
MainThread
Демон запущен
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 15, 2023 - 11:04:48
Django version 2.2.28, using settings 'temp_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Демон работает
Демон работает
Демон работает
Демон работает

Мне кажется, что приложение джанго запускает при старте поток и убивает его, а потом начинает новый (уже рабочий) из-за чего мое условие не работает. Я видел несколько тем по этому вопросу, но ответы на них в основном "увы и ах", может быть у кого-нибудь найдутся соображения как это реализовать?

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

Ответы

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