Backwards-incompatible. The django stats app writes to its own sqlite database by default (huey-stats.db in settings.BASE_DIR), instead of DATABASES['default']. To keep recording in your main Django database, specify the database explicitly:
HUEY_STATS = {'database': 'postgresql://user:password@localhost/my_db'}HUEY_STATS['database'] takes a db-url or a peewee Database, or use
HUEY_STATS['filename'] to set the sqlite path. See the Django docs section
for building a peewee database from your existing DATABASES entry.
The admin Events log is now rendered from the stats database through
peewee, rather than being a ModelAdmin via ORM. It is now linked from the
dashboard's Recent events heading.
Consumer:
- Add
--shutdown-timeoutoption to bound graceful shutdown time. - Add
--graceful-signaloption to allow making SIGTERM the graceful shutdown signal (e.g.-g TERM).
User-facing APIs:
- Add
ttltolock_task()andput_if_empty()so locks expire on their own. Supported by memory and redis storages, others raiseNotImplementedError.RedisHueyrequires server hash-field TTL support (redis 7.4+ or valkey 9+),RedisExpireHueyworks on any version. - Add
timeoutparameter toaget_result().
Small stuff:
- Ensure one raising signal receiver does not prevent the remaining receivers from running.
- Fix crontab ranges with a step (
0-30/5) and wrap-around ranges (22-2,day_of_week='1-7'). RaiseValueErrorwhen a field matches no values. - Pass failed chord members to the callback as
huey.Errorand skipped (revoked, expired, cancelled) members ashuey.SKIPPEDinstead of a raw exception orNone. - Delete chord partial results explicitly on completion, so they no longer linger until expiry on
RedisExpireStorage. - Write the error of a failed pipeline stage to every skipped downstream stage, so their
Resulthandles raise instead of blocking. - Accept an explicit
idinTaskWrapper.s(), matchingschedule().
Storage:
- Skip messages that fail to deserialize in
Huey.pending()andHuey.scheduled(), logging the error, asread_schedule()already does. - Add
clean_nameoption toRedisHuey(default toTrue). SpecifyFalseto stop stripping non-alphanumeric characters from the storage namespace. The default will change in a future release. - Reduce Redis round-trips for
peek_data,pop_dataanddelete_data, and makeRedisExpireStorage.incr()set the TTL atomically w/ the increment. - Skip the exclusive lock in
SqliteStorage.dequeue()when the queue is empty, so idle consumers no longer block producers and the scheduler. - Batch the
SqliteStorage.read_schedule()delete to avoid sqlite's parameter limit when many tasks come due at once. Same fix inSqlHuey. - Order
SqliteStorage.read_schedule()andSqlHuey.read_schedule()by(timestamp, id), matchingPostgresStorage. - Add
queueto the sqlite task index (task_queue_priority_id) so queues sharing a file no longer scan each other's rows. The oldtask_priority_idindex is dropped when the schema is initialized. I'll get rid of the temporary in-band drop in a few releases. - Add
peek_many()to the storage API. Revocation checks now fetch the task and task-class keys in one round trip. - Return str keys from
result_items()on every storage backend. Redis and File storage previously returned bytes.
Stats:
- Better handling for
timeout,locked,rate-limitedandretryingin stats recorder. - Log dropped events in the stats recorder instead of failing silently.
- Fix stats recorder
max_eventspruning to count rows per queue. With multiple queues sharing a stats db, each queue retained only a fraction of the configured cap. - Add
inflight_hoursoption to stats recorder, replacing the hardcoded 6 hour in-flight cutoff. - Require the
change_hueydashboardpermission for the django admin dashboard's revoke, restore and flush controls. Previously any staff user who could view the dashboard could also flush the queue. - Add
huey[stats]extra which installs ol' peewee.
