Функция, работающая в фоновом режиме (и сам запуск) в приложении Django - PullRequest
0 голосов
/ 04 января 2019

Я создаю простое приложение Django.Внутри этого приложения у меня есть один флажок.Я сохраняю это состояние флажка в базе данных, если он отмечен в базе данных. У меня есть значение True, если флажок снят, у меня есть значение False.Там нет проблем с этой частью.Теперь я создал функцию, которая выводит для меня каждые 10 секунд все это значение состояния флажка из базы данных.

Функция, которую я помещаю в файл views.py, и он выглядит так:

def get_value():
    while True:
        value_change = TurnOnOff.objects.first()
        if value_change.turnOnOff:
            print("true")
        else:
            print("false")
        time.sleep(10)

Дело в том, что функция должна работать все время.Например, если я в models.py code checkbox = models.BooleanField(default=False) после того, как я выполню команду python manage.py runserver, это должно дать мне вывод, например:

Performing system checks...

System check identified no issues (0 silenced).
January 04, 2019 - 09:19:47
Django version 2.1.3, using settings 'CMS.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
true
true
true
true

, тогда, если я захожу на сайт и изменяю состояние, должно вывести false, это очевидно,Но, как вы заметили, проблема заключается в том, как запустить этот метод.Это должно работать все время, даже если я еще не захожу на сайт.И эта часть меня смущает.Как это сделать правильно?

Мне нужно признать, что я пробовал некоторые решения

  • поместить эту функцию в конец файла manage.py,

  • поместите эту функцию в def ready(self),

  • создайте класс промежуточного программного обеспечения и поместите метод здесь (пример кода ниже).

Но это решение не работает.

промежуточного класса:

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        get_value()

1 Ответ

0 голосов
/ 04 января 2019

Сельдерей - это то, что лучше всего соответствует вашим потребностям из того, что вы описали.

Celery - это асинхронная очередь задач / очередь заданий, основанная на распределенной передаче сообщений. Он ориентирован на работу в режиме реального времени, но также поддерживает планирование.

Модули выполнения, называемые задачами, выполняются одновременно на одном или нескольких рабочих серверах с использованием многопроцессорной обработки, Eventlet или gevent. Задачи могут выполняться асинхронно (в фоновом режиме) или синхронно (ждать до готовности).

Вам нужно создать задачу, периодически запускать ее , вызывать , если вы хотите вручную вызвать (в некоторых представлениях / контроллере).

ПРИМЕЧАНИЕ: не использовать time.sleep(10)

...