настройка django apscheduler с помощью apache и mod wsgi

#python #django #apache #mod-wsgi #apscheduler

#python #django #apache #mod-wsgi #apscheduler

Вопрос:

Я настроил django apscheduler в проекте django, выполнив приведенную ниже команду — python manage.py runapscheduler рунапшед

но теперь мы переместили приложение на рабочий сервер и настроили с помощью Apache amp; Mod wsgi, так что теперь, как настроить и запустить apscheduler.

Пожалуйста, предложите.

Комментарии:

1. Я полагаю, вы можете сделать то же самое. Активируйте свой виртуальный env, а затем выполните ту же команду

2. как я могу это сделать в apache. выполнение команды явно будет временным решением. есть ли другой способ.

Ответ №1:

https://medium.com/@mrgrantanderson/replacing-cron-and-running-background-tasks-in-django-using-apscheduler-and-django-apscheduler-d562646c062e объясняет, как установить AppConfig, который включает планировщик:

Для этого вам необходимо добавить следующее в свой settings.py :

 INSTALLED_APPS = [
    ...
    "django_apscheduler",
]

# This scheduler config will:
# - Store jobs in the project database
# - Execute jobs in threads inside the application process
SCHEDULER_CONFIG = {
    "apscheduler.jobstores.default": {
        "class": "django_apscheduler.jobstores:DjangoJobStore"
    },
    'apscheduler.executors.processpool': {
        "type": "threadpool"
    },
}
SCHEDULER_AUTOSTART = True
 

Файл, который запускает ваш планировщик, может выглядеть следующим образом:

 import logging

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ProcessPoolExecutor, ThreadPoolExecutor
from django_apscheduler.jobstores import register_events, register_job

from django.conf import settings

# Create scheduler to run in a thread inside the application process
scheduler = BackgroundScheduler(settings.SCHEDULER_CONFIG)

def start():
    if settings.DEBUG:
        # Hook into the apscheduler logger
        logging.basicConfig()
        logging.getLogger('apscheduler').setLevel(logging.DEBUG)

    # Adding this job here instead of to crons.
    # This will do the following:
    # - Add a scheduled job to the job store on application initialization
    # - The job will execute a model class method at midnight each day
    # - replace_existing in combination with the unique ID prevents duplicate copies of the job
    scheduler.add_job("core.models.MyModel.my_class_method", "cron", id="my_class_method", hour=0, replace_existing=True)

    # Add the scheduled jobs to the Django admin interface
    register_events(scheduler)

    scheduler.start()
 

И AppConfig, который запустит планировщик следующим образом:

 from django.conf import settings

class CoreConfig(AppConfig):
    name = "core"

     def ready(self):
        from . import scheduler
        if settings.SCHEDULER_AUTOSTART:
            scheduler.start()
 

(весь код скопирован из руководства, связанного выше).

Однако обратите внимание, что django-apscheduler заявляет в своем README, что

Компромисс этой простоты заключается в том, что вам нужно быть осторожным, чтобы убедиться, что у вас есть только один планировщик, активно работающий в определенный момент времени.(https://github.com/jcass77/django-apscheduler#quick-start ).

Насколько я понимаю, это не гарантируется, если вы продуктивно запускаете планировщик в многопоточной среде Django. Поэтому к этому решению определенно следует относиться с недоверием — более правильным способом было бы следовать предложению README и создать команду блокировки для планировщика и запускать ее независимо от того, что вы обслуживаете в выделенном процессе.