Эта команда будет запускаться с помощью supervisor или ей подобной
class Command(BaseCommand): ''' Дополнительные команды для старта и остановки потоков, manage.py optional start - запускает потоки manage.py optional stop - останавливает потоки ''' def add_arguments(self, parser): parser.add_argument('command', default=False) parser.add_argument('-stop', default=False) def handle(self, *args, **options): # for i in options: # print(i, options[i]) if options['command'] == 'start': self.stdout.write('Scheduled messages is started') start() if options['command'] == 'stop': self.stdout.write('Scheduled messages is stopped') def start(): def message_scheduled(name, event): while event.is_set(): mes = Message.objects.filter(status='scheduled').values('owner_id', 'message_id', 'timestamp') # получаем id сообщений которые соответствуют времени отправки send_dlist = {i['message_id']: get_token(i['owner_id']) for i in mes if i['timestamp'] in range(round(time.time() - 60), round(time.time()))} scheduled_req(send_dlist) print(send_dlist) time.sleep(10) def stat(name, event): while event.is_set(): print('<Thread: %s>' % (name)) collect_stats() time.sleep(10) try: event = threading.Event() event.set() t1 = threading.Thread(target=message_scheduled, args=('mes', event)) t2 = threading.Thread(target=stat, args=('stat', event)) t1.start() t2.start() while True: time.sleep(0.01) except KeyboardInterrupt: event.clear() t1.join() t2.join()