#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 и создать команду блокировки для планировщика и запускать ее независимо от того, что вы обслуживаете в выделенном процессе.