Redis-backed runtime-editable cron scheduler for RQ
Project description
rq-rediscron provides Redis-backed subclasses for RQ cron scheduling:
RedisCronJob
RedisCronScheduler
Cron job definitions are stored in Redis hashes and indexed in a sorted set by next enqueue time. This lets scheduler processes pick up job creates, edits, and deletes at runtime without restart.
Only one RedisCronScheduler process runs at a time. The scheduler acquires rq:cron_jobs:lock during register_birth(), extends that lock on heartbeat, and releases it during register_death(). A second scheduler can start after the lock TTL expires, which provides failover without duplicate enqueue loops.
Usage
from redis import Redis
from rediscron import RedisCronScheduler
def rebuild_metric(metric_id: str) -> None:
...
connection = Redis.from_url("redis://localhost:6379/0")
scheduler = RedisCronScheduler(connection)
scheduler.register(
rebuild_metric,
queue_name="metrics",
id="metric:pm25",
args=("pm25",),
interval=300,
)
scheduler.start()
Redis keys
Keys used by this package:
rq:cron_job:{id} stores one cron job hash.
rq:cron_jobs indexes job ids by next enqueue timestamp.
rq:cron_jobs:lock allows one live scheduler process at a time.
rq:cron_jobs:last_update records runtime changes.
rq:cron_jobs:events publishes create, update, and delete events.
Development
To install pre-commit, do the following:
$ uv tool install pre-commit --with pre-commit-uv
To enable pre-commit git hooks:
$ pre-commit install
Why?
The original cron implementation in RQ is holding all the cron jobs locally as a list inside the instance of the scheduler. Because of this design choice, as soon as the scheduler is started, the list of scheduled jobs cannot be easily modified.
In some cases, we want to be able to add/edit/delete scheduled jobs on the fly and for the scheduler to acknowledge those events accordingly. This is what lead the design choices for this package.
Inspired by redisbeat, a celery scheduler using redis to store metadata. See Hello RedBeat: A New Celery Beat Scheduler for mor info.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rq_rediscron-0.1.7.tar.gz.
File metadata
- Download URL: rq_rediscron-0.1.7.tar.gz
- Upload date:
- Size: 50.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3e3b59de326668d9a0750f3b744518df4e7fc4d3413cba8a0f9b2fe8ede7228
|
|
| MD5 |
b2e1392c9793d515832e60dadfb8d185
|
|
| BLAKE2b-256 |
ceb98a4b8c92839c64e7ac73fd69c19c969ee5289f349087638aff63da5a2945
|
File details
Details for the file rq_rediscron-0.1.7-py3-none-any.whl.
File metadata
- Download URL: rq_rediscron-0.1.7-py3-none-any.whl
- Upload date:
- Size: 12.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d41802cb41a2801aa0b64c162b5ca3d30eb4a3d0804139af22a1ac8ad0db7e8e
|
|
| MD5 |
11b876e3b6025cf31340e766fc86a0b5
|
|
| BLAKE2b-256 |
59945580f9d5f9b14f9e1d5f26047c5268fb283beeacc12b5e645ac217d71aa2
|