dqueue

python通用延迟消息队列


Keywords
延迟队列, 消息队列
License
BSD-3-Clause
Install
pip install dqueue==0.1.2

Documentation

dqueue

dqueue is an experimental fork of django-lightweight-queue, targeting greater flexibility.

The rest of this document may be incorrect as we experiment with alternative configurations.

Basic Usage

import time
from dqueue import task

# Define a task
@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.

Configuration

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

DQUEUE_BACKEND = 'dqueue.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 special.py containing:

DQUEUE_REDIS_PORT = 12345

and then running:

$ python manage.py queue_runner --config=special.py

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.

Backends

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 manage.py queue_runner

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

$ python manage.py queue_runner --machine 2 --of 4

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

$ python manage.py queue_runner --exact-configuration --config=special.py

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.

Example

Given a Django configuration containing:

DQUEUE_WORKERS = {
    'queue1': 3,
}

and a special.py containing:

DQUEUE_WORKERS = {
    'queue1': 2,
}

Running any of:

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

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

$ python manage.py queue_runner --exact-configuration --config=special.py

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 cron.py file in the root folder of the Django app which defines the command and which contains a CONFIG variable:

CONFIG = (
    {
        '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,
    },
)