Django APscheduler предотвращает выполнение запланированного задания большим количеством работников

Я использую APScheduler в Django, на Windows IIS для запуска моего фонового скрипта. Проблема в том, что taks запускается несколько раз. Если я запускаю ту же программу на своем компьютере, она запускается только один раз, но когда я загружаю ее на сервер windows (на котором размещено мое приложение Django), она запускается большее количество раз. Я думаю, это как-то связано с количеством рабочих? Задание запланировано, но каждый раз, когда задание выполняется, оно как будто запускает случайное количество экземпляров. Сначала 1 раз, потом 2, потом 10, потом опять 2. Даже если у меня стоит 'replace_existing=True, coalesce= True, misfire_grace_time = 1, max_instances = 1'

planer_zad.py

from apscheduler.schedulers.background import BackgroundScheduler
from blog.views import cron_mail_overdue

def start():

scheduler.add_job(cron_mail_overdue, "cron", hour=7, minute=14, day_of_week='mon-sun', id="task002", replace_existing=True, coalesce= True, misfire_grace_time = 10, max_instances = 1)

scheduler.start()

apps.py

from django.apps import AppConfig


class BlogConfig(AppConfig):
    name = 'blog'

    def ready(self):
        #print('Starting Scheduler...')
        from .planer import planer_zad
        planer_zad.start()

Для теста я попробовал 'interval':

scheduler.add_job(cron_mail_overdue, "interval", minutes=1, id="task002", replace_existing=True, coalesce= True, misfire_grace_time = 10, max_instances = 1)

Пробовал:

    scheduler = BackgroundScheduler({
        'apscheduler.executors.default': {
            'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
            'max_workers': '1'
        },
        'apscheduler.executors.processpool': {
            'type': 'processpool',
            'max_workers': '1'
        },
        'apscheduler.job_defaults.coalesce': 'True',
        'apscheduler.job_defaults.max_instances': '1',
        'apscheduler.timezone': 'UTC',
    })


scheduler.add_job(cron_mail_overdue, "cron", hour=9, minute=3, second=00, day_of_week='mon-sun', id="task002", replace_existing=True, coalesce= True, misfire_grace_time = 10, max_instances = 1)

scheduler.start()

Не работает. Иногда запускается только один раз, затем 12 раз.

Example of received emails

Просто проверьте, существует ли уже объект в ready() :

# django/myapp/apps.py
from django.apps import AppConfig
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger

class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'

    def __init__(self, app_name, app_module):
        super(BlogConfig, self).__init__(app_name, app_module)
        self.planer_zad = None

    def ready(self):
        if os.environ.get('RUN_MAIN', None) != 'true':
            return
        if self.planer_zad is None:
            background_scheduler = BackgroundScheduler()
            background_scheduler.add_job(task1, CronTrigger.from_crontab('* * * * *')) # Every minutes (debug).
            background_scheduler.start()
            return background_scheduler

    def task1(self):
        print("cron task is working")

Вы можете вызвать его позже :

# api.py
from django.apps import apps

@router.get("/background-task")
def background_task(request):
    """
        Run a background task.
    """
    user = request.user
    blog_config= apps.get_app_config('blog')
    background_scheduler = blog_config.background_scheduler
    return {"status": "Success", "True": str(background_scheduler)}
Вернуться на верх