Procrastinate
Python sync/async tasks with application locks and configurable recovery.
View pinned source / version e049c4d74cde · Features reviewed against pinned default-branch source; release label is separately verified, not assumed to be the benchmark adapter version.
What this system is built around
Sync and async Python tasks with PostgreSQL scheduling, application locks and optional Django integration.
A Python-focused option when sync/async code or Django integration is useful. Useful when application-level serialization keys are needed, with recovery tasks and retry policies configured deliberately.
Editorial fit, based on the cited design. Verify against your workload.Semantics & operating model
Concise claims with their scope intact. “Not verified” means this review did not establish the answer.
Claiming & concurrency
DocumentedWorker concurrency is configurable. lock strings serialize jobs sharing a key; priority then creation time determine order among waiting jobs. Claims use FOR UPDATE SKIP LOCKED.
Transactional enqueue
Documentedconfigure(connection=...) defers on an application-owned transaction with supported psycopg or SQLAlchemy connectors; caller commits. This is current default-branch behavior, not an assertion about older adapter pins.
Crash recovery & retries
QualifiedHeartbeats identify stalled workers, but crashed jobs may remain doing forever unless an operator or configured periodic task retries them.
Delayed & recurring work
Documentedschedule_at / schedule_in defer jobs; App.periodic implements cron with distributed once-per-period enqueue. A worker must be running for periodic enqueue.
Uniqueness / deduplication
Documentedqueueing_lock rejects another pending todo job via AlreadyEnqueued; it permits multiple doing jobs. Combine with an execution lock if serialized execution is also needed.
Postgres extension required
Not requiredThe installed schema consists of SQL tables/functions; docs specify Python 3.10+ and PostgreSQL 13+, with no extra queue service.
Operator interface
DocumentedProcrastinate exposes job/event/periodic models in Django admin; models are read-only by default. This is an optional Django integration, not a standalone bundled dashboard.
Tradeoffs to carry into a test
Retrying after abrupt worker death is not automatic unless you configure stalled-job recovery.
Explicit stalled-job recoveryQueueing lock prevents a second todo entry, not overlapping doing entries or duplicate external side effects.
Queueing locks Execution lock scope