Lightweight & modular queue and cron system for Django
Clone or download
PeterJCLaw Call proper request handler
This appears to have been the proper method to be calling, even
under Python 2 ('handle_one_request' doesn't even exist under Python 3).
Latest commit fe353c3 Aug 27, 2018

Django Lightweight Queue

DLQ is a lightweight & modular queue and cron system for Django.

Basic Usage

import time
from django_lightweight_queue import task

# Define a task
def long_running_task(first_arg, second_arg):
    time.sleep(first_arg * second_arg)

# Request that the task be executed at some point
long_running_task(4, second_arg=9)

See the docstring on the task decorator for more details.


All automatically picked up configuration options begin with LIGHTWEIGHT_QUEUE_ and can be found in They should be placed in the usual Django settings files, for example:

LIGHTWEIGHT_QUEUE_BACKEND = 'django_lightweight_queue.backends.redis.RedisBackend'

If desired, specific configuration overrides can be placed in a standalone python file which passed on the command line.

For example, given a containing:


and then running:

$ python queue_runner

will result in the runner to use the settings from the specified configuration file in preference to settings from the Django environment. Any settings not present in the specified file are inherited from the global configuration.


There are three built-in backends:

  • Synchronous (the default): executes the task inline, without any actual queuing
  • Redis: executes tasks at-most-once using Redis for storage of the enqueued tasks
  • Reliable Redis: executes tasks at-least-once using Redis for storage of the enqueued tasks

Running Workers

The queue runner is implemented as a Django management command:

$ python queue_runner

Workers can be distributed over multiple hosts by telling each runner that it is part of a pool:

$ python queue_runner --machine 2 --of 4

Alternatively a runner can be told explicitly which configuration to use:

$ python queue_runner --exact-configuration

When using --exact-configuration the number of workers is configured exactly, rather than being treated as the configuration for a pool. Additionally, exactly-configured runners will not run any cron workers.


Given a Django configuration containing:

    'queue1': 3,

and a containing:

    'queue1': 2,

Running any of:

$ python queue_runner --machine 1 --of 3 # or,
$ python queue_runner --machine 2 --of 3 # or,
$ python queue_runner --machine 3 --of 3

will result in one worker for queue1 on the current machine, while:

$ python queue_runner --exact-configuration

will result in two workers on the current machine.

Cron Tasks

DLQ supports the use of a cron-like specification of Django management commands to be run at certain times.

To specify that a management command should be run at a given time, place a file in the root folder of the Django app which defines the command and which contains a CONFIG variable:

        'command': 'my_cron_command',
        # Day values 1-7 to match datetime.datetime.utcnow().isoweekday()
        'days': '*',
        'hours': '*',
        'minutes': '*',
        # Equivalent behaviour to the kwarg to `task` of the same name
        'sigkill_on_stop': True,