.. image:: docs/_static/logo.png
:align: center
:alt: Q logo
:target: https://django-q.readthedocs.org/
A multiprocessing distributed task queue for Django
---------------------------------------------------
|image0| |image1| |docs| |image2|
Features
~~~~~~~~
- Multiprocessing worker pool
- Asynchronous tasks
- Scheduled, cron and repeated tasks
- Signed and compressed packages
- Failure and success database or cache
- Result hooks, groups and chains
- Django Admin integration
- PaaS compatible with multiple instances
- Multi cluster monitor
- Redis, Disque, IronMQ, SQS, MongoDB or ORM
- Rollbar and Sentry support
Requirements
~~~~~~~~~~~~
- `Django <https://www.djangoproject.com>`__ > = 2.2
- `Django-picklefield <https://github.com/gintas/django-picklefield>`__
- `Arrow <https://github.com/crsmithdev/arrow>`__
- `Blessed <https://github.com/jquast/blessed>`__
Tested with: Python 3.7, 3.8, 3.9 Django 2.2.X and 3.2.X
.. warning:: Since Python 3.7 `async` became a reserved keyword and was refactored to `async_task`
Brokers
~~~~~~~
- `Redis <https://django-q.readthedocs.org/en/latest/brokers.html#redis>`__
- `Disque <https://django-q.readthedocs.org/en/latest/brokers.html#disque>`__
- `IronMQ <https://django-q.readthedocs.org/en/latest/brokers.html#ironmq>`__
- `Amazon SQS <https://django-q.readthedocs.org/en/latest/brokers.html#amazon-sqs>`__
- `MongoDB <https://django-q.readthedocs.org/en/latest/brokers.html#mongodb>`__
- `Django ORM <https://django-q.readthedocs.org/en/latest/brokers.html#django-orm>`__
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
- Choose a message `broker <https://django-q.readthedocs.org/en/latest/brokers.html>`__ , configure and install the appropriate client library.
Read the full documentation at `https://django-q.readthedocs.org <https://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 <https://django-q.readthedocs.org/en/latest/configure.html>`__.
Management Commands
~~~~~~~~~~~~~~~~~~~
Start a cluster with::
$ python manage.py qcluster
Monitor your clusters with::
$ python manage.py qmonitor
Monitor your clusters' memory usage with::
$ python manage.py qmemory
Check overall statistics with::
$ python manage.py qinfo
Creating Tasks
~~~~~~~~~~~~~~
Use `async_task` from your code to quickly offload tasks:
.. code:: python
from django_q.tasks import async_task, result
# create the task
async_task('math.copysign', 2, -2)
# or with a reference
import math.copysign
task_id = async_task(copysign, 2, -2)
# get the result
task_result = result(task_id)
# result returns None if the task has not been executed yet
# you can wait for it
task_result = result(task_id, 200)
# but in most cases you will want to use a hook:
async_task('math.modf', 2.5, hook='hooks.print_result')
# hooks.py
def print_result(task):
print(task.result)
For more info see `Tasks <https://django-q.readthedocs.org/en/latest/tasks.html>`__
Schedule
~~~~~~~~
Schedules are regular Django models. You can manage them through the
Admin page or directly from your code:
.. code:: python
# Use the schedule function
from django_q.tasks import schedule
schedule('math.copysign',
2, -2,
hook='hooks.print_result',
schedule_type=Schedule.DAILY)
# Or create the object directly
from django_q.models import Schedule
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))
# Use a cron expression
schedule('math.hypot',
3, 4,
schedule_type=Schedule.CRON,
cron = '0 22 * * 1-5')
For more info check the `Schedules <https://django-q.readthedocs.org/en/latest/schedules.html>`__ documentation.
Testing
~~~~~~~
To run the tests you will need the following in addition to install requirements:
* `py.test <http://pytest.org/latest/>`__
* `pytest-django <https://github.com/pytest-dev/pytest-django>`__
* Disque from https://github.com/antirez/disque.git
* Redis
* MongoDB
Or you can use the included Docker Compose file.
The following commands can be used to run the tests:
.. code:: bash
# Create virtual environment
python -m venv venv
# Install requirements
venv/bin/pip install -r requirements.txt
# Install test dependencies
venv/bin/pip install pytest pytest-django django-redis bson pymongo django hiredis croniter
# Install django-q
venv/bin/python setup.py develop
# Run required services (you need to have docker-compose installed)
docker-compose -f test-services-docker-compose.yaml up -d
# Run tests
venv/bin/pytest
# Stop the services required by tests (when you no longer plan to run tests)
docker-compose -f test-services-docker-compose.yaml down
Locale
~~~~~~
Currently available in English, German and French.
Translation pull requests are always welcome.
Todo
~~~~
- Better tests and coverage
- Less dependencies?
Acknowledgements
~~~~~~~~~~~~~~~~
- Django Q was inspired by working with
`Django-RQ <https://github.com/ui/django-rq>`__ and
`RQ <https://github.com/ui/django-rq>`__
- Human readable hashes by
`HumanHash <https://github.com/zacharyvoase/humanhash>`__
- Redditors feedback at `r/django <https://www.reddit.com/r/django/>`__
- JetBrains for their `Open Source Support Program <https://www.jetbrains.com/community/opensource>`__
.. |image0| image:: https://github.com/koed00/django-q/workflows/Tests/badge.svg?branche=master
:target: https://github.com/Koed00/django-q/actions?query=workflow%3Atests
.. |image1| image:: http://codecov.io/github/Koed00/django-q/coverage.svg?branch=master
:target: http://codecov.io/github/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/
Raw data
{
"_id": null,
"home_page": "https://github.com/singularit-de/django-q",
"name": "sit-django-q",
"maintainer": "Janek Mangold",
"docs_url": null,
"requires_python": ">=3.6.2,<4",
"maintainer_email": "janek.mangold@singular-it.de",
"keywords": "django,distributed,multiprocessing,queue,scheduler,singularit",
"author": "Ilan Steemers",
"author_email": "koed00@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/6d/97/4aeeac8e2444c53c4e979ed392be949ebec56fca2ad4b0fd1558465e2aab/sit_django_q-0.1.0.tar.gz",
"platform": null,
"description": ".. image:: docs/_static/logo.png\n :align: center\n :alt: Q logo\n :target: https://django-q.readthedocs.org/\n\nA multiprocessing distributed task queue for Django\n---------------------------------------------------\n\n|image0| |image1| |docs| |image2|\n\nFeatures\n~~~~~~~~\n\n- Multiprocessing worker pool\n- Asynchronous tasks\n- Scheduled, cron and repeated tasks\n- Signed and compressed packages\n- Failure and success database or cache\n- Result hooks, groups and chains\n- Django Admin integration\n- PaaS compatible with multiple instances\n- Multi cluster monitor\n- Redis, Disque, IronMQ, SQS, MongoDB or ORM\n- Rollbar and Sentry support\n\nRequirements\n~~~~~~~~~~~~\n\n- `Django <https://www.djangoproject.com>`__ > = 2.2\n- `Django-picklefield <https://github.com/gintas/django-picklefield>`__\n- `Arrow <https://github.com/crsmithdev/arrow>`__\n- `Blessed <https://github.com/jquast/blessed>`__\n\nTested with: Python 3.7, 3.8, 3.9 Django 2.2.X and 3.2.X\n\n.. warning:: Since Python 3.7 `async` became a reserved keyword and was refactored to `async_task`\n\nBrokers\n~~~~~~~\n- `Redis <https://django-q.readthedocs.org/en/latest/brokers.html#redis>`__\n- `Disque <https://django-q.readthedocs.org/en/latest/brokers.html#disque>`__\n- `IronMQ <https://django-q.readthedocs.org/en/latest/brokers.html#ironmq>`__\n- `Amazon SQS <https://django-q.readthedocs.org/en/latest/brokers.html#amazon-sqs>`__\n- `MongoDB <https://django-q.readthedocs.org/en/latest/brokers.html#mongodb>`__\n- `Django ORM <https://django-q.readthedocs.org/en/latest/brokers.html#django-orm>`__\n\nInstallation\n~~~~~~~~~~~~\n\n- Install the latest version with pip::\n\n $ pip install django-q\n\n\n- Add `django_q` to your `INSTALLED_APPS` in your projects `settings.py`::\n\n INSTALLED_APPS = (\n # other apps\n 'django_q',\n )\n\n- Run Django migrations to create the database tables::\n\n $ python manage.py migrate\n\n- Choose a message `broker <https://django-q.readthedocs.org/en/latest/brokers.html>`__ , configure and install the appropriate client library.\n\nRead the full documentation at `https://django-q.readthedocs.org <https://django-q.readthedocs.org>`__\n\n\nConfiguration\n~~~~~~~~~~~~~\n\nAll configuration settings are optional. e.g:\n\n.. code:: python\n\n # settings.py example\n Q_CLUSTER = {\n 'name': 'myproject',\n 'workers': 8,\n 'recycle': 500,\n 'timeout': 60,\n 'compress': True,\n 'cpu_affinity': 1,\n 'save_limit': 250,\n 'queue_limit': 500,\n 'label': 'Django Q',\n 'redis': {\n 'host': '127.0.0.1',\n 'port': 6379,\n 'db': 0, }\n }\n\nFor full configuration options, see the `configuration documentation <https://django-q.readthedocs.org/en/latest/configure.html>`__.\n\nManagement Commands\n~~~~~~~~~~~~~~~~~~~\n\nStart a cluster with::\n\n $ python manage.py qcluster\n\nMonitor your clusters with::\n\n $ python manage.py qmonitor\n\nMonitor your clusters' memory usage with::\n\n $ python manage.py qmemory\n\nCheck overall statistics with::\n\n $ python manage.py qinfo\n\nCreating Tasks\n~~~~~~~~~~~~~~\n\nUse `async_task` from your code to quickly offload tasks:\n\n.. code:: python\n\n from django_q.tasks import async_task, result\n\n # create the task\n async_task('math.copysign', 2, -2)\n\n # or with a reference\n import math.copysign\n\n task_id = async_task(copysign, 2, -2)\n\n # get the result\n task_result = result(task_id)\n\n # result returns None if the task has not been executed yet\n # you can wait for it\n task_result = result(task_id, 200)\n\n # but in most cases you will want to use a hook:\n\n async_task('math.modf', 2.5, hook='hooks.print_result')\n\n # hooks.py\n def print_result(task):\n print(task.result)\n\nFor more info see `Tasks <https://django-q.readthedocs.org/en/latest/tasks.html>`__\n\n\nSchedule\n~~~~~~~~\n\nSchedules are regular Django models. You can manage them through the\nAdmin page or directly from your code:\n\n.. code:: python\n\n # Use the schedule function\n from django_q.tasks import schedule\n\n schedule('math.copysign',\n 2, -2,\n hook='hooks.print_result',\n schedule_type=Schedule.DAILY)\n\n # Or create the object directly\n from django_q.models import Schedule\n\n Schedule.objects.create(func='math.copysign',\n hook='hooks.print_result',\n args='2,-2',\n schedule_type=Schedule.DAILY\n )\n\n # Run a task every 5 minutes, starting at 6 today\n # for 2 hours\n import arrow\n\n schedule('math.hypot',\n 3, 4,\n schedule_type=Schedule.MINUTES,\n minutes=5,\n repeats=24,\n next_run=arrow.utcnow().replace(hour=18, minute=0))\n\n # Use a cron expression\n schedule('math.hypot',\n 3, 4,\n schedule_type=Schedule.CRON,\n cron = '0 22 * * 1-5')\n\nFor more info check the `Schedules <https://django-q.readthedocs.org/en/latest/schedules.html>`__ documentation.\n\n\nTesting\n~~~~~~~\n\nTo run the tests you will need the following in addition to install requirements:\n\n* `py.test <http://pytest.org/latest/>`__\n* `pytest-django <https://github.com/pytest-dev/pytest-django>`__\n* Disque from https://github.com/antirez/disque.git\n* Redis\n* MongoDB\n\nOr you can use the included Docker Compose file.\n\nThe following commands can be used to run the tests:\n\n.. code:: bash\n\n # Create virtual environment\n python -m venv venv\n\n # Install requirements\n venv/bin/pip install -r requirements.txt\n\n # Install test dependencies\n venv/bin/pip install pytest pytest-django django-redis bson pymongo django hiredis croniter\n\n # Install django-q\n venv/bin/python setup.py develop\n\n # Run required services (you need to have docker-compose installed)\n docker-compose -f test-services-docker-compose.yaml up -d\n\n # Run tests\n venv/bin/pytest\n\n # Stop the services required by tests (when you no longer plan to run tests)\n docker-compose -f test-services-docker-compose.yaml down\n\nLocale\n~~~~~~\n\nCurrently available in English, German and French.\nTranslation pull requests are always welcome.\n\nTodo\n~~~~\n\n- Better tests and coverage\n- Less dependencies?\n\nAcknowledgements\n~~~~~~~~~~~~~~~~\n\n- Django Q was inspired by working with\n `Django-RQ <https://github.com/ui/django-rq>`__ and\n `RQ <https://github.com/ui/django-rq>`__\n- Human readable hashes by\n `HumanHash <https://github.com/zacharyvoase/humanhash>`__\n- Redditors feedback at `r/django <https://www.reddit.com/r/django/>`__\n\n- JetBrains for their `Open Source Support Program <https://www.jetbrains.com/community/opensource>`__\n\n.. |image0| image:: https://github.com/koed00/django-q/workflows/Tests/badge.svg?branche=master\n :target: https://github.com/Koed00/django-q/actions?query=workflow%3Atests\n.. |image1| image:: http://codecov.io/github/Koed00/django-q/coverage.svg?branch=master\n :target: http://codecov.io/github/Koed00/django-q?branch=master\n.. |image2| image:: http://badges.gitter.im/Join%20Chat.svg\n :target: https://gitter.im/Koed00/django-q\n.. |docs| image:: https://readthedocs.org/projects/docs/badge/?version=latest\n :alt: Documentation Status\n :scale: 100\n :target: https://django-q.readthedocs.org/\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A multiprocessing distributed task queue for Django with modification for timezone aware schedules",
"version": "0.1.0",
"split_keywords": [
"django",
"distributed",
"multiprocessing",
"queue",
"scheduler",
"singularit"
],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "391738fa7d55c0ef7c06fa76b37c3966",
"sha256": "40779be5f2199fbde28746892dc449f1d39365e810362036065e2b271ea59327"
},
"downloads": -1,
"filename": "sit_django_q-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "391738fa7d55c0ef7c06fa76b37c3966",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6.2,<4",
"size": 90735,
"upload_time": "2022-12-01T17:18:08",
"upload_time_iso_8601": "2022-12-01T17:18:08.017979Z",
"url": "https://files.pythonhosted.org/packages/ac/f8/135cb21447b110ec8d1115c91dd56cbb7e462ba538d0836458961efc7be5/sit_django_q-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"md5": "99a56025564b852343c66b5108f9eef6",
"sha256": "71444110121596ff5feb74f3f5b0bdbc2043835dc74789835a1b20ef1837db7d"
},
"downloads": -1,
"filename": "sit_django_q-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "99a56025564b852343c66b5108f9eef6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6.2,<4",
"size": 70483,
"upload_time": "2022-12-01T17:18:10",
"upload_time_iso_8601": "2022-12-01T17:18:10.367756Z",
"url": "https://files.pythonhosted.org/packages/6d/97/4aeeac8e2444c53c4e979ed392be949ebec56fca2ad4b0fd1558465e2aab/sit_django_q-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-12-01 17:18:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "singularit-de",
"github_project": "django-q",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "sit-django-q"
}