Запуск планировщиков 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 и запускать их после запуска проекта.