Запуск планировщиков Django 2

Это мои файлы-

from django.apps import AppConfig

class ApiConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'api'

    def ready(self):
        import api.scheduler as scheduler
        scheduler.start()
from apscheduler.schedulers.background import BackgroundScheduler

def fetch_new_raw_data():
    '''Fetches new data'''

def start():
    scheduler = BackgroundScheduler()
    scheduler.add_job(fetch_new_raw_data, 'interval', minutes=1)
    scheduler.start()
    fetch_new_raw_data()

При использовании py manage.py runserver django порождает 2 процесса, каждый из которых запускает свой планировщик.
Есть ли способ загрузить планировщик только в 1 процесс и использовать тот же самый в обоих, или это нормально для них, чтобы запустить свой собственный планировщик?

В режиме производства или отладки этот класс инициализируется несколько раз. это решение не очень хорошо работает, но вы можете записать os.getpid() результат в файл или запись в DB и проверять его каждый раз. Если PID изменился, вы запускаете планировщик снова.

import os
from django.apps import AppConfig

class ApiConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'api'

    def ready(self):
        pid = os.getpid()
        with open("/path/to/log/api_pid", "r") as pid_file:
            if pid_file.read().strip() == pid:
                return
        with open("/path/to/log/api_pid", "w") as pid_file:
            pid_file.write(pid)
        import api.scheduler as scheduler
            scheduler.start()

Но я рекомендую вам использовать внешние сервисы, такие как celery project или использовать management commands и запускать их после запуска проекта.

Вернуться на верх