probit-scheduler

probit scheduler - JSON redis backed scheduler for celery beat.


License
MIT
Install
pip install probit-scheduler==0.1.7

Documentation

probit-scheduler - Dynamic JSON redis backed scheduler for celery made from https://github.com/SPSCommerce/swiss-chard.

To install use: pip install probit-scheduler

To start scheduler use cli command (type of celery beat scheduler): celery -A {proj_dir} beat -S probit.scheduler.ProbitScheduler --workdir="{working_dir}" -f "{log_path}" -l warning

To configure, set CELERYBEAT_SCHEDULER to probit.scheduler.ProbitScheduler and specify a CELERY_REDIS_SCHEDULER_URL.

    CELERYBEAT_SCHEDULER="probit.scheduler.ProbitScheduler"
	CELERY_REDIS_SCHEDULER_URL = "redis://localhost:6379/1"
	CELERYBEAT_SCHEDULE = {
	    'TestTask': {
	        'task': '¸path.to.TestTask',
	        'schedule': timedelta(seconds=3),
	        'args': (),
	    }
	}

Scheduler allows you dynamic addition and removal of task from scheduler. Use case: Enable or disable sending specific email messages every day at 3 o'clock.

SCHEDULER EXAMPLES:

# get scheduler from config key **CELERY_REDIS_SCHEDULER_URL** which is something like **'redis://localhost:6379/1'**
# or if you have redis under password then something like **redis://:mypassword@localhost:6379/1**
scheduler = EntryProxy(StrictRedis.from_url(app.config["CELERY_REDIS_SCHEDULER_URL"]))

# create new scheduler entry
# with timedelta every 3 seconds
entry = scheduler.load({
    "name": "myNewTask",
    "schedule": {'seconds': 3, 'days': 0, 'microseconds': 0, 'relative': False, 'type': 'delta'},
    "task": "TestTask",
    "args": [],
    "kwargs": {},
    "options": {},
    "last_run_at": None,
    "total_run_count": 5
})
# or like crontab every day at 5 oclock
entry = scheduler.load({
    "name": "myNewTask",
    "schedule": { "hour": 5, "day_of_week": "*", "type": "crontab", "minute": 0 },
    "task": "TestTask",
    "args": [],
    "kwargs": {},
    "options": {},
    "last_run_at": None,
    "total_run_count": 5
})

# save global scheduler task (update task with the same call)
scheduler.save_task(entry)

# get global tasks from redis
tasks = scheduler.get_tasks()

# delete task from global tasks
scheduler.remove_task("TaskName")

Future stuff: - save task for group (scheduler.save_group_task("group_name", entry)) - get tasks for group (scheduler.get_group_tasks("group_name")) - remove task for group (scheduler.remove_group_task("group_name", "task_name"))