Фоновые задания
Назначение
Сервис обеспечивает выполнение длительных или отложенных операций в фоновом режиме. Включает очереди заданий , воркеры (bench worker), планировщик (scheduler_events) и настраиваемые запланированные задачи (Scheduled Job Type).
Цели и задачи
- Выполнять тяжелые операции (отчеты, рассылки, синхронизация) без блокировки интерфейса.
- Планировать повторяющиеся задачи (ежедневно, еженедельно, по расписанию cron).
- Распределять нагрузку по очередям (short, default, long) с разными таймаутами.
- Запускать задания от имени администратора с контролем ошибок и логов.
- Обеспечивать отказоустойчивость за счет очередей и воркеров.
Для кого
- Разработчики, вызывающие Dinext.enqueue и настраивающие хуки планировщика.
- Администраторы сервера, запускающие воркеры и планировщик.
- Пользователи, инициирующие длительные операции (массовая рассылка, выгрузка), которые выполняются в фоне.
Основные понятия
- Очередь (queue) — именованная очередь заданий: short (300 с), default (300 с), long (1500 с); можно задавать свои очереди в конфиге.
- Воркер (worker) — процесс, обрабатывающий очередь:
bench worker --queue short|default|longили несколько очередей. - Dinext.enqueue — постановка метода в очередь:
Dinext.enqueue(method, queue='default', timeout=..., is_async=True, ...)илиDinext.enqueue_doc(doctype, name, method_name, ...). - Планировщик (scheduler) — выполнение задач по расписанию: хуки hourly, daily, weekly, monthly, *_long, all, cron; либо Scheduled Job Type без хука.
- Задания выполняются от имени Administrator, если не указано иное.
Основные сущности / объекты
- background_jobs.py, scheduler.py .
- Конфигурация воркеров: common_site_config.json
workers; burst-режим воркера (--burst).
Основные сценарии / процессов
Постановка задания в очередь (разработчик)
- В коде вызвать
Dinext.enqueue("path.to.method", queue="default", timeout=300, arg1=val1)илиDinext.enqueue_doc("тип документа", docname, "method_name", ...). - Метод будет выполнен воркером в указанной очереди; не блокирует текущий запрос.
- При ошибке в задании проверить логи воркера и Error Log в системе.
- Для длительных операций использовать очередь
longи увеличить timeout в разумных пределах.
Запуск воркеров (администратор)
- Запустить воркер для очереди:
bench worker --queue default(или short, long). - Для нескольких очередей:
bench worker --queue short,default. - В production использовать systemd/supervisor для постоянной работы воркеров; при падении процесса перезапускать.
- Планировщик обычно запускается через
bench scheduleили встроенный механизм bench; убедиться, что он активен для ежедневных/ежечасных задач.
Планирование повторяющихся задач
- В приложении зарегистрировать хук в hooks.py:
scheduler_events = { "hourly": ["app.module.hourly_task"], "daily": ["app.module.daily_task"] }. - Либо создать Scheduled Job Type в системе и привязать метод без изменения кода приложения.
- Задачи выполняются по расписанию; логи и ошибки смотреть в логах планировщика и Error Log.
Правила и ограничения
- Без запущенных воркеров задания в очереди не выполняются; планировщик также зависит от процесса scheduler.
- Таймауты очередей ограничены (short/default 300 с, long 1500 с по умолчанию); очень длинные операции разбивать на шаги или увеличивать таймаут для своей очереди в конфиге.
- Задания выполняются от имени Administrator; при необходимости проверять права внутри метода для «виртуального» пользователя или передавать user в аргументах и использовать Dinext.set_user().
Результаты / отчетность
- Выполненные фоновые операции (отчеты, рассылки, синхронизация).
- Логи воркеров и планировщика; Error Log при сбоях заданий.
- Мониторинг очередей (размер очереди, задержки) при наличии инструментов мониторинга.
Типовые вопросы и ошибки (FAQ)
Задание не выполняется
Проверьте: воркер запущен для нужной очереди (bench worker --queue default); метод указан верно и доступен (import path); в логах воркера нет ошибки. При использовании enqueue_doc убедитесь, что документ существует и метод вызывается корректно.
Как выполнить задание синхронно (без очереди)?
Вызвать метод напрямую или использовать Dinext.enqueue(..., is_async=False) (тогда выполнится в том же процессе и может увеличить время ответа запроса). Для тяжелых операций предпочтительно оставлять is_async=True.
Где смотреть расписание задач?
В коде приложений — hooks.py, ключ scheduler_events. В системе — список Scheduled Job Type (если используется). Документация Dinext описывает стандартные события: hourly, daily, weekly, monthly, cron.