.. image:: docs/_static/logo.png :align: center :alt: Q logo :target: https://django-q.readthedocs.org/ A multiprocessing task queue for Django --------------------------------------- |image0| |image1| |docs| |image2| Features ~~~~~~~~ - Multiprocessing worker pool - Asynchronous tasks - Scheduled and repeated tasks - Encrypted and compressed packages - Failure and success database - Result hooks and groups - Django Admin integration - PaaS compatible with multiple instances - Multi cluster monitor - Redis broker - Python 2 and 3 Requirements ~~~~~~~~~~~~ - `Redis-py `__ - `Django `__ > = 1.7 - `Django-picklefield `__ - `Arrow `__ - `Blessed `__ Tested with: Python 2.7 & 3.4. Django 1.7.10 & 1.8.4 Installation ~~~~~~~~~~~~ - Install the latest version with pip:: $ pip install django-q - Add `django_q` to your `INSTALLED_APPS` in your projects `settings.py`:: INSTALLED_APPS = ( # other apps 'django_q', ) - Run Django migrations to create the database tables:: $ python manage.py migrate - Make sure you have a `Redis `__ server running somewhere Read the full documentation at `http://django-q.readthedocs.org `__ Configuration ~~~~~~~~~~~~~ All configuration settings are optional. e.g: .. code:: python # settings.py example Q_CLUSTER = { 'name': 'myproject', 'workers': 8, 'recycle': 500, 'timeout': 60, 'compress': True, 'cpu_affinity': 1, 'save_limit': 250, 'queue_limit': 500, 'label': 'Django Q', 'redis': { 'host': '127.0.0.1', 'port': 6379, 'db': 0, } } For full configuration options, see the `configuration documentation `__. If you are using `django-redis `__ , you can `configure `__ Django Q to use its connection pool. Management Commands ~~~~~~~~~~~~~~~~~~~ Start a cluster with:: $ python manage.py qcluster Monitor your clusters with:: $ python manage.py qmonitor Creating Tasks ~~~~~~~~~~~~~~ Use `async` from your code to quickly offload tasks: .. code:: python from django_q import async, result # create the task async('math.copysign', 2, -2) # or with a reference import math.copysign task_id = async(copysign, 2, -2) # get the result task_result = result(task_id) # result returns None if the task has not been executed yet # so in most cases you will want to use a hook: async('math.modf', 2.5, hook='hooks.print_result') # hooks.py def print_result(task): print(task.result) For more info see `Tasks `__ Schedule ~~~~~~~~ Schedules are regular Django models. You can manage them through the Admin page or directly from your code: .. code:: python from django_q import Schedule, schedule # Use the schedule function schedule('math.copysign', 2, -2, hook='hooks.print_result', schedule_type=Schedule.DAILY) # Or create the object directly Schedule.objects.create(func='math.copysign', hook='hooks.print_result', args='2,-2', schedule_type=Schedule.DAILY ) # Run a task every 5 minutes, starting at 6 today # for 2 hours import arrow schedule('math.hypot', 3, 4, schedule_type=Schedule.MINUTES, minutes=5, repeats=24, next_run=arrow.utcnow().replace(hour=18, minute=0)) For more info check the `Schedules `__ documentation. Testing ~~~~~~~ To run the tests you will need `py.test `__ and `pytest-django `__ Todo ~~~~ - Better tests and coverage - Get out of Alpha - Less dependencies? Acknowledgements ~~~~~~~~~~~~~~~~ - Django Q was inspired by working with `Django-RQ `__ and `RQ `__ - Human readable hashes by `HumanHash `__ .. |image0| image:: https://travis-ci.org/Koed00/django-q.svg?branch=master :target: https://travis-ci.org/Koed00/django-q .. |image1| image:: https://coveralls.io/repos/Koed00/django-q/badge.svg?branch=master :target: https://coveralls.io/r/Koed00/django-q?branch=master .. |image2| image:: http://badges.gitter.im/Join%20Chat.svg :target: https://gitter.im/Koed00/django-q .. |docs| image:: https://readthedocs.org/projects/docs/badge/?version=latest :alt: Documentation Status :scale: 100 :target: https://django-q.readthedocs.org/