| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084 | 
							- .. _changelog-2.0:
 
- ===============================
 
-  Change history for Celery 2.0
 
- ===============================
 
- .. contents::
 
-     :local:
 
- .. _version-2.0.3:
 
- 2.0.3
 
- =====
 
- :release-date: 2010-08-27 12:00 P.M CEST
 
- :release-by: Ask Solem
 
- .. _v203-fixes:
 
- Fixes
 
- -----
 
- * Worker: Properly handle connection errors happening while
 
-   closing consumers.
 
- * Worker: Events are now buffered if the connection is down,
 
-   then sent when the connection is re-established.
 
- * No longer depends on the :pypi:`mailer` package.
 
-     This package had a name space collision with `django-mailer`,
 
-     so its functionality was replaced.
 
- * Redis result backend: Documentation typos: Redis doesn't have
 
-   database names, but database numbers. The default database is now 0.
 
- * :class:`~celery.task.control.inspect`:
 
-   `registered_tasks` was requesting an invalid command because of a typo.
 
-     See issue #170.
 
- * :setting:`CELERY_ROUTES`: Values defined in the route should now have
 
-   precedence over values defined in :setting:`CELERY_QUEUES` when merging
 
-   the two.
 
-     With the follow settings:
 
-     .. code-block:: python
 
-         CELERY_QUEUES = {'cpubound': {'exchange': 'cpubound',
 
-                                       'routing_key': 'cpubound'}}
 
-         CELERY_ROUTES = {'tasks.add': {'queue': 'cpubound',
 
-                                        'routing_key': 'tasks.add',
 
-                                        'serializer': 'json'}}
 
-     The final routing options for `tasks.add` will become:
 
-     .. code-block:: python
 
-         {'exchange': 'cpubound',
 
-          'routing_key': 'tasks.add',
 
-          'serializer': 'json'}
 
-     This was not the case before: the values
 
-     in :setting:`CELERY_QUEUES` would take precedence.
 
- * Worker crashed if the value of :setting:`CELERY_TASK_ERROR_WHITELIST` was
 
-   not an iterable
 
- * :func:`~celery.execute.apply`: Make sure `kwargs['task_id']` is
 
-   always set.
 
- * `AsyncResult.traceback`: Now returns :const:`None`, instead of raising
 
-   :exc:`KeyError` if traceback is missing.
 
- * :class:`~celery.task.control.inspect`: Replies did not work correctly
 
-   if no destination was specified.
 
- * Can now store result/meta-data for custom states.
 
- * Worker: A warning is now emitted if the sending of task error
 
-   emails fails.
 
- * ``celeryev``: Curses monitor no longer crashes if the terminal window
 
-   is resized.
 
-     See issue #160.
 
- * Worker: On macOS it is not possible to run `os.exec*` in a process
 
-   that is threaded.
 
-       This breaks the SIGHUP restart handler,
 
-       and is now disabled on macOS, emitting a warning instead.
 
-     See issue #152.
 
- * :mod:`celery.execute.trace`: Properly handle `raise(str)`,
 
-   which is still allowed in Python 2.4.
 
-     See issue #175.
 
- * Using urllib2 in a periodic task on macOS crashed because
 
-   of the proxy auto detection used in macOS.
 
-     This is now fixed by using a workaround.
 
-     See issue #143.
 
- * Debian init-scripts: Commands should not run in a sub shell
 
-     See issue #163.
 
- * Debian init-scripts: Use the absolute path of ``celeryd`` program to allow stat
 
-     See issue #162.
 
- .. _v203-documentation:
 
- Documentation
 
- -------------
 
- * getting-started/broker-installation: Fixed typo
 
-     `set_permissions ""` -> `set_permissions ".*"`.
 
- * Tasks User Guide: Added section on database transactions.
 
-     See issue #169.
 
- * Routing User Guide: Fixed typo `"feed": -> {"queue": "feeds"}`.
 
-     See issue #169.
 
- * Documented the default values for the :setting:`CELERYD_CONCURRENCY`
 
-   and :setting:`CELERYD_PREFETCH_MULTIPLIER` settings.
 
- * Tasks User Guide: Fixed typos in the subtask example
 
- * celery.signals: Documented worker_process_init.
 
- * Daemonization cookbook: Need to export DJANGO_SETTINGS_MODULE in
 
-   `/etc/default/celeryd`.
 
- * Added some more FAQs from stack overflow
 
- * Daemonization cookbook: Fixed typo `CELERYD_LOGFILE/CELERYD_PIDFILE`
 
-     to `CELERYD_LOG_FILE` / `CELERYD_PID_FILE`
 
-     Also added troubleshooting section for the init-scripts.
 
- .. _version-2.0.2:
 
- 2.0.2
 
- =====
 
- :release-date: 2010-07-22 11:31 A.M CEST
 
- :release-by: Ask Solem
 
- * Routes: When using the dict route syntax, the exchange for a task
 
-   could disappear making the task unroutable.
 
-     See issue #158.
 
- * Test suite now passing on Python 2.4
 
- * No longer have to type `PYTHONPATH=.` to use ``celeryconfig`` in the current
 
-   directory.
 
-     This is accomplished by the default loader ensuring that the current
 
-     directory is in `sys.path` when loading the config module.
 
-     `sys.path` is reset to its original state after loading.
 
-     Adding the current working directory to `sys.path` without the user
 
-     knowing may be a security issue, as this means someone can drop a Python module in the users
 
-     directory that executes arbitrary commands. This was the original reason
 
-     not to do this, but if done *only when loading the config module*, this
 
-     means that the behavior will only apply to the modules imported in the
 
-     config module, which I think is a good compromise (certainly better than
 
-     just explicitly setting `PYTHONPATH=.` anyway)
 
- * Experimental Cassandra backend added.
 
- * Worker: SIGHUP handler accidentally propagated to worker pool processes.
 
-     In combination with :sha:`7a7c44e39344789f11b5346e9cc8340f5fe4846c`
 
-     this would make each child process start a new worker instance when
 
-     the terminal window was closed :/
 
- * Worker: Do not install SIGHUP handler if running from a terminal.
 
-     This fixes the problem where the worker is launched in the background
 
-     when closing the terminal.
 
- * Worker: Now joins threads at shutdown.
 
-     See issue #152.
 
- * Test tear down: Don't use `atexit` but nose's `teardown()` functionality
 
-   instead.
 
-     See issue #154.
 
- * Debian worker init-script: Stop now works correctly.
 
- * Task logger: `warn` method added (synonym for `warning`)
 
- * Can now define a white list of errors to send error emails for.
 
-     Example:
 
-     .. code-block:: python
 
-         CELERY_TASK_ERROR_WHITELIST = ('myapp.MalformedInputError',)
 
-     See issue #153.
 
- * Worker: Now handles overflow exceptions in `time.mktime` while parsing
 
-   the ETA field.
 
- * LoggerWrapper: Try to detect loggers logging back to stderr/stdout making
 
-   an infinite loop.
 
- * Added :class:`celery.task.control.inspect`: Inspects a running worker.
 
-     Examples:
 
-     .. code-block:: pycon
 
-         # Inspect a single worker
 
-         >>> i = inspect('myworker.example.com')
 
-         # Inspect several workers
 
-         >>> i = inspect(['myworker.example.com', 'myworker2.example.com'])
 
-         # Inspect all workers consuming on this vhost.
 
-         >>> i = inspect()
 
-         ### Methods
 
-         # Get currently executing tasks
 
-         >>> i.active()
 
-         # Get currently reserved tasks
 
-         >>> i.reserved()
 
-         # Get the current eta schedule
 
-         >>> i.scheduled()
 
-         # Worker statistics and info
 
-         >>> i.stats()
 
-         # List of currently revoked tasks
 
-         >>> i.revoked()
 
-         # List of registered tasks
 
-         >>> i.registered_tasks()
 
- *  Remote control commands `dump_active`/`dump_reserved`/`dump_schedule`
 
-    now replies with detailed task requests.
 
-     Containing the original arguments and fields of the task requested.
 
-     In addition the remote control command `set_loglevel` has been added,
 
-     this only changes the log level for the main process.
 
- * Worker control command execution now catches errors and returns their
 
-   string representation in the reply.
 
- * Functional test suite added
 
-     :mod:`celery.tests.functional.case` contains utilities to start
 
-     and stop an embedded worker process, for use in functional testing.
 
- .. _version-2.0.1:
 
- 2.0.1
 
- =====
 
- :release-date: 2010-07-09 03:02 P.M CEST
 
- :release-by: Ask Solem
 
- * multiprocessing.pool: Now handles encoding errors, so that pickling errors
 
-   doesn't crash the worker processes.
 
- * The remote control command replies was not working with RabbitMQ 1.8.0's
 
-   stricter equivalence checks.
 
-     If you've already hit this problem you may have to delete the
 
-     declaration:
 
-     .. code-block:: console
 
-         $ camqadm exchange.delete celerycrq
 
-     or:
 
-     .. code-block:: console
 
-         $ python manage.py camqadm exchange.delete celerycrq
 
- * A bug sneaked in the ETA scheduler that made it only able to execute
 
-   one task per second(!)
 
-     The scheduler sleeps between iterations so it doesn't consume too much CPU.
 
-     It keeps a list of the scheduled items sorted by time, at each iteration
 
-     it sleeps for the remaining time of the item with the nearest deadline.
 
-     If there are no eta tasks it will sleep for a minimum amount of time, one
 
-     second by default.
 
-     A bug sneaked in here, making it sleep for one second for every task
 
-     that was scheduled. This has been fixed, so now it should move
 
-     tasks like hot knife through butter.
 
-     In addition a new setting has been added to control the minimum sleep
 
-     interval; :setting:`CELERYD_ETA_SCHEDULER_PRECISION`. A good
 
-     value for this would be a float between 0 and 1, depending
 
-     on the needed precision. A value of 0.8 means that when the ETA of a task
 
-     is met, it will take at most 0.8 seconds for the task to be moved to the
 
-     ready queue.
 
- * Pool: Supervisor did not release the semaphore.
 
-     This would lead to a deadlock if all workers terminated prematurely.
 
- * Added Python version trove classifiers: 2.4, 2.5, 2.6 and 2.7
 
- * Tests now passing on Python 2.7.
 
- * Task.__reduce__: Tasks created using the task decorator can now be pickled.
 
- * :file:`setup.py`: :pypi:`nose` added to `tests_require`.
 
- * Pickle should now work with SQLAlchemy 0.5.x
 
- * New homepage design by Jan Henrik Helmers: http://celeryproject.org
 
- * New Sphinx theme by Armin Ronacher: http://docs.celeryproject.org/
 
- * Fixed "pending_xref" errors shown in the HTML rendering of the
 
-   documentation. Apparently this was caused by new changes in Sphinx 1.0b2.
 
- * Router classes in :setting:`CELERY_ROUTES` are now imported lazily.
 
-     Importing a router class in a module that also loads the Celery
 
-     environment would cause a circular dependency. This is solved
 
-     by importing it when needed after the environment is set up.
 
- * :setting:`CELERY_ROUTES` was broken if set to a single dict.
 
-     This example in the docs should now work again:
 
-     .. code-block:: python
 
-         CELERY_ROUTES = {'feed.tasks.import_feed': 'feeds'}
 
- * `CREATE_MISSING_QUEUES` was not honored by apply_async.
 
- * New remote control command: `stats`
 
-     Dumps information about the worker, like pool process ids, and
 
-     total number of tasks executed by type.
 
-     Example reply:
 
-     .. code-block:: python
 
-         [{'worker.local':
 
-              'total': {'tasks.sleeptask': 6},
 
-              'pool': {'timeouts': [None, None],
 
-                       'processes': [60376, 60377],
 
-                       'max-concurrency': 2,
 
-                       'max-tasks-per-child': None,
 
-                       'put-guarded-by-semaphore': True}}]
 
- * New remote control command: `dump_active`
 
-     Gives a list of tasks currently being executed by the worker.
 
-     By default arguments are passed through repr in case there
 
-     are arguments that is not JSON encodable. If you know
 
-     the arguments are JSON safe, you can pass the argument `safe=True`.
 
-     Example reply:
 
-     .. code-block:: pycon
 
-         >>> broadcast('dump_active', arguments={'safe': False}, reply=True)
 
-         [{'worker.local': [
 
-             {'args': '(1,)',
 
-              'time_start': 1278580542.6300001,
 
-              'name': 'tasks.sleeptask',
 
-              'delivery_info': {
 
-                  'consumer_tag': '30',
 
-                  'routing_key': 'celery',
 
-                  'exchange': 'celery'},
 
-              'hostname': 'casper.local',
 
-              'acknowledged': True,
 
-              'kwargs': '{}',
 
-              'id': '802e93e9-e470-47ed-b913-06de8510aca2',
 
-             }
 
-         ]}]
 
- * Added experimental support for persistent revokes.
 
-     Use the `-S|--statedb` argument to the worker to enable it:
 
-     .. code-block:: console
 
-         $ celeryd --statedb=/var/run/celeryd
 
-     This will use the file: `/var/run/celeryd.db`,
 
-     as the `shelve` module automatically adds the `.db` suffix.
 
- .. _version-2.0.0:
 
- 2.0.0
 
- =====
 
- :release-date: 2010-07-02 02:30 P.M CEST
 
- :release-by: Ask Solem
 
- Foreword
 
- --------
 
- Celery 2.0 contains backward incompatible changes, the most important
 
- being that the Django dependency has been removed so Celery no longer
 
- supports Django out of the box, but instead as an add-on package
 
- called `django-celery`_.
 
- We're very sorry for breaking backwards compatibility, but there's
 
- also many new and exciting features to make up for the time you lose
 
- upgrading, so be sure to read the :ref:`News <v200-news>` section.
 
- Quite a lot of potential users have been upset about the Django dependency,
 
- so maybe this is a chance to get wider adoption by the Python community as
 
- well.
 
- Big thanks to all contributors, testers and users!
 
- .. _v200-django-upgrade:
 
- Upgrading for Django-users
 
- --------------------------
 
- Django integration has been moved to a separate package: `django-celery`_.
 
- * To upgrade you need to install the `django-celery`_ module and change:
 
-   .. code-block:: python
 
-     INSTALLED_APPS = 'celery'
 
-   to:
 
-   .. code-block:: python
 
-     INSTALLED_APPS = 'djcelery'
 
- * If you use `mod_wsgi` you need to add the following line to your `.wsgi`
 
-   file:
 
-     .. code-block:: python
 
-         import os
 
-         os.environ['CELERY_LOADER'] = 'django'
 
- * The following modules has been moved to `django-celery`_:
 
-     =====================================  =====================================
 
-     **Module name**                        **Replace with**
 
-     =====================================  =====================================
 
-     `celery.models`                        `djcelery.models`
 
-     `celery.managers`                      `djcelery.managers`
 
-     `celery.views`                         `djcelery.views`
 
-     `celery.urls`                          `djcelery.urls`
 
-     `celery.management`                    `djcelery.management`
 
-     `celery.loaders.djangoapp`             `djcelery.loaders`
 
-     `celery.backends.database`             `djcelery.backends.database`
 
-     `celery.backends.cache`                `djcelery.backends.cache`
 
-     =====================================  =====================================
 
- Importing :mod:`djcelery` will automatically setup Celery to use Django loader.
 
- loader.  It does this by setting the :envvar:`CELERY_LOADER` environment variable to
 
- `"django"` (it won't change it if a loader is already set.)
 
- When the Django loader is used, the "database" and "cache" result backend
 
- aliases will point to the :mod:`djcelery` backends instead of the built-in backends,
 
- and configuration will be read from the Django settings.
 
- .. _`django-celery`: http://pypi.python.org/pypi/django-celery
 
- .. _v200-upgrade:
 
- Upgrading for others
 
- --------------------
 
- .. _v200-upgrade-database:
 
- Database result backend
 
- ~~~~~~~~~~~~~~~~~~~~~~~
 
- The database result backend is now using `SQLAlchemy`_ instead of the
 
- Django ORM, see `Supported Databases`_ for a table of supported databases.
 
- The `DATABASE_*` settings has been replaced by a single setting:
 
- :setting:`CELERY_RESULT_DBURI`. The value here should be an
 
- `SQLAlchemy Connection String`_, some examples include:
 
- .. code-block:: python
 
-     # sqlite (filename)
 
-     CELERY_RESULT_DBURI = 'sqlite:///celerydb.sqlite'
 
-     # mysql
 
-     CELERY_RESULT_DBURI = 'mysql://scott:tiger@localhost/foo'
 
-     # postgresql
 
-     CELERY_RESULT_DBURI = 'postgresql://scott:tiger@localhost/mydatabase'
 
-     # oracle
 
-     CELERY_RESULT_DBURI = 'oracle://scott:tiger@127.0.0.1:1521/sidname'
 
- See `SQLAlchemy Connection Strings`_ for more information about connection
 
- strings.
 
- To specify additional SQLAlchemy database engine options you can use
 
- the :setting:`CELERY_RESULT_ENGINE_OPTIONS` setting:
 
-     .. code-block:: python
 
-         # echo enables verbose logging from SQLAlchemy.
 
-         CELERY_RESULT_ENGINE_OPTIONS = {'echo': True}
 
- .. _`SQLAlchemy`:
 
-     http://www.sqlalchemy.org
 
- .. _`Supported Databases`:
 
-     http://www.sqlalchemy.org/docs/core/engines.html#supported-databases
 
- .. _`SQLAlchemy Connection String`:
 
-     http://www.sqlalchemy.org/docs/core/engines.html#database-urls
 
- .. _`SQLAlchemy Connection Strings`:
 
-     http://www.sqlalchemy.org/docs/core/engines.html#database-urls
 
- .. _v200-upgrade-cache:
 
- Cache result backend
 
- ~~~~~~~~~~~~~~~~~~~~
 
- The cache result backend is no longer using the Django cache framework,
 
- but it supports mostly the same configuration syntax:
 
-     .. code-block:: python
 
-         CELERY_CACHE_BACKEND = 'memcached://A.example.com:11211;B.example.com'
 
- To use the cache backend you must either have the `pylibmc`_ or
 
- `python-memcached`_ library installed, of which the former is regarded
 
- as the best choice.
 
- .. _`pylibmc`: http://pypi.python.org/pypi/pylibmc
 
- .. _`python-memcached`: http://pypi.python.org/pypi/python-memcached
 
- The support backend types are `memcached://` and `memory://`,
 
- we haven't felt the need to support any of the other backends
 
- provided by Django.
 
- .. _v200-incompatible:
 
- Backward incompatible changes
 
- -----------------------------
 
- * Default (python) loader now prints warning on missing `celeryconfig.py`
 
-   instead of raising :exc:`ImportError`.
 
-     The worker raises :exc:`~@ImproperlyConfigured` if the configuration
 
-     is not set up. This makes it possible to use `--help` etc., without having a
 
-     working configuration.
 
-     Also this makes it possible to use the client side of celery without being
 
-     configured:
 
-     .. code-block:: pycon
 
-         >>> from carrot.connection import BrokerConnection
 
-         >>> conn = BrokerConnection('localhost', 'guest', 'guest', '/')
 
-         >>> from celery.execute import send_task
 
-         >>> r = send_task('celery.ping', args=(), kwargs={}, connection=conn)
 
-         >>> from celery.backends.amqp import AMQPBackend
 
-         >>> r.backend = AMQPBackend(connection=conn)
 
-         >>> r.get()
 
-         'pong'
 
- * The following deprecated settings has been removed (as scheduled by
 
-   the :ref:`deprecation-timeline`):
 
-     =====================================  =====================================
 
-     **Setting name**                       **Replace with**
 
-     =====================================  =====================================
 
-     `CELERY_AMQP_CONSUMER_QUEUES`          `CELERY_QUEUES`
 
-     `CELERY_AMQP_EXCHANGE`                 `CELERY_DEFAULT_EXCHANGE`
 
-     `CELERY_AMQP_EXCHANGE_TYPE`            `CELERY_DEFAULT_EXCHANGE_TYPE`
 
-     `CELERY_AMQP_CONSUMER_ROUTING_KEY`     `CELERY_QUEUES`
 
-     `CELERY_AMQP_PUBLISHER_ROUTING_KEY`    `CELERY_DEFAULT_ROUTING_KEY`
 
-     =====================================  =====================================
 
- * The `celery.task.rest` module has been removed, use `celery.task.http`
 
-   instead (as scheduled by the :ref:`deprecation-timeline`).
 
- * It's no longer allowed to skip the class name in loader names.
 
-   (as scheduled by the :ref:`deprecation-timeline`):
 
-     Assuming the implicit `Loader` class name is no longer supported,
 
-     if you use e.g.:
 
-     .. code-block:: python
 
-         CELERY_LOADER = 'myapp.loaders'
 
-     You need to include the loader class name, like this:
 
-     .. code-block:: python
 
-         CELERY_LOADER = 'myapp.loaders.Loader'
 
- * :setting:`CELERY_TASK_RESULT_EXPIRES` now defaults to 1 day.
 
-     Previous default setting was to expire in 5 days.
 
- *  AMQP backend: Don't use different values for `auto_delete`.
 
-     This bug became visible with RabbitMQ 1.8.0, which no longer
 
-     allows conflicting declarations for the auto_delete and durable settings.
 
-     If you've already used celery with this backend chances are you
 
-     have to delete the previous declaration:
 
-     .. code-block:: console
 
-         $ camqadm exchange.delete celeryresults
 
- * Now uses pickle instead of cPickle on Python versions <= 2.5
 
-     cPickle is broken in Python <= 2.5.
 
-     It unsafely and incorrectly uses relative instead of absolute imports,
 
-     so e.g.:
 
-     .. code-block:: python
 
-           exceptions.KeyError
 
-     becomes:
 
-     .. code-block:: python
 
-           celery.exceptions.KeyError
 
-     Your best choice is to upgrade to Python 2.6,
 
-     as while the pure pickle version has worse performance,
 
-     it is the only safe option for older Python versions.
 
- .. _v200-news:
 
- News
 
- ----
 
- * **celeryev**: Curses Celery Monitor and Event Viewer.
 
-     This is a simple monitor allowing you to see what tasks are
 
-     executing in real-time and investigate tracebacks and results of ready
 
-     tasks. It also enables you to set new rate limits and revoke tasks.
 
-     Screenshot:
 
-     .. figure:: ../images/celeryevshotsm.jpg
 
-     If you run `celeryev` with the `-d` switch it will act as an event
 
-     dumper, simply dumping the events it receives to standard out:
 
-     .. code-block:: console
 
-         $ celeryev -d
 
-         -> celeryev: starting capture...
 
-         casper.local [2010-06-04 10:42:07.020000] heartbeat
 
-         casper.local [2010-06-04 10:42:14.750000] task received:
 
-             tasks.add(61a68756-27f4-4879-b816-3cf815672b0e) args=[2, 2] kwargs={}
 
-             eta=2010-06-04T10:42:16.669290, retries=0
 
-         casper.local [2010-06-04 10:42:17.230000] task started
 
-             tasks.add(61a68756-27f4-4879-b816-3cf815672b0e) args=[2, 2] kwargs={}
 
-         casper.local [2010-06-04 10:42:17.960000] task succeeded:
 
-             tasks.add(61a68756-27f4-4879-b816-3cf815672b0e)
 
-             args=[2, 2] kwargs={} result=4, runtime=0.782663106918
 
-         The fields here are, in order: *sender hostname*, *timestamp*, *event type* and
 
-         *additional event fields*.
 
- * AMQP result backend: Now supports `.ready()`, `.successful()`,
 
-   `.result`, `.status`, and even responds to changes in task state
 
- * New user guides:
 
-     * :ref:`guide-workers`
 
-     * :ref:`guide-canvas`
 
-     * :ref:`guide-routing`
 
- * Worker: Standard out/error is now being redirected to the log file.
 
- * :pypi:`billiard` has been moved back to the celery repository.
 
-     =====================================  =====================================
 
-     **Module name**                        **celery equivalent**
 
-     =====================================  =====================================
 
-     `billiard.pool`                        `celery.concurrency.processes.pool`
 
-     `billiard.serialization`               `celery.serialization`
 
-     `billiard.utils.functional`            `celery.utils.functional`
 
-     =====================================  =====================================
 
-     The :pypi:`billiard` distribution may be maintained, depending on interest.
 
- * now depends on :pypi:`carrot` >= 0.10.5
 
- * now depends on :pypi:`pyparsing`
 
- * Worker: Added `--purge` as an alias to `--discard`.
 
- * Worker: :kbd:`Control-c` (SIGINT) once does warm shutdown,
 
-   hitting :kbd:`Control-c` twice forces termination.
 
- * Added support for using complex Crontab-expressions in periodic tasks. For
 
-   example, you can now use:
 
-     .. code-block:: pycon
 
-         >>> crontab(minute='*/15')
 
-     or even:
 
-     .. code-block:: pycon
 
-         >>> crontab(minute='*/30', hour='8-17,1-2', day_of_week='thu-fri')
 
-   See :ref:`guide-beat`.
 
- * Worker: Now waits for available pool processes before applying new
 
-   tasks to the pool.
 
-     This means it doesn't have to wait for dozens of tasks to finish at shutdown
 
-     because it has applied prefetched tasks without having any pool
 
-     processes available to immediately accept them.
 
-     See issue #122.
 
- * New built-in way to do task callbacks using
 
-   :class:`~celery.subtask`.
 
-   See :ref:`guide-canvas` for more information.
 
- * TaskSets can now contain several types of tasks.
 
-   :class:`~celery.task.sets.TaskSet` has been refactored to use
 
-   a new syntax, please see :ref:`guide-canvas` for more information.
 
-   The previous syntax is still supported, but will be deprecated in
 
-   version 1.4.
 
- * TaskSet failed() result was incorrect.
 
-     See issue #132.
 
- * Now creates different loggers per task class.
 
-     See issue #129.
 
- * Missing queue definitions are now created automatically.
 
-     You can disable this using the :setting:`CELERY_CREATE_MISSING_QUEUES`
 
-     setting.
 
-     The missing queues are created with the following options:
 
-     .. code-block:: python
 
-         CELERY_QUEUES[name] = {'exchange': name,
 
-                                'exchange_type': 'direct',
 
-                                'routing_key': 'name}
 
-    This feature is added for easily setting up routing using the `-Q`
 
-    option to the worker:
 
-    .. code-block:: console
 
-        $ celeryd -Q video, image
 
-    See the new routing section of the User Guide for more information:
 
-    :ref:`guide-routing`.
 
- * New Task option: `Task.queue`
 
-     If set, message options will be taken from the corresponding entry
 
-     in :setting:`CELERY_QUEUES`. `exchange`, `exchange_type` and `routing_key`
 
-     will be ignored
 
- * Added support for task soft and hard time limits.
 
-     New settings added:
 
-     * :setting:`CELERYD_TASK_TIME_LIMIT`
 
-         Hard time limit. The worker processing the task will be killed and
 
-         replaced with a new one when this is exceeded.
 
-     * :setting:`CELERYD_TASK_SOFT_TIME_LIMIT`
 
-         Soft time limit. The :exc:`~@SoftTimeLimitExceeded`
 
-         exception will be raised when this is exceeded.  The task can catch
 
-         this to e.g. clean up before the hard time limit comes.
 
-     New command-line arguments to ``celeryd`` added:
 
-     `--time-limit` and `--soft-time-limit`.
 
-     What's left?
 
-     This won't work on platforms not supporting signals (and specifically
 
-     the `SIGUSR1` signal) yet. So an alternative the ability to disable
 
-     the feature all together on nonconforming platforms must be implemented.
 
-     Also when the hard time limit is exceeded, the task result should
 
-     be a `TimeLimitExceeded` exception.
 
- * Test suite is now passing without a running broker, using the carrot
 
-   in-memory backend.
 
- * Log output is now available in colors.
 
-     =====================================  =====================================
 
-     **Log level**                          **Color**
 
-     =====================================  =====================================
 
-     `DEBUG`                                Blue
 
-     `WARNING`                              Yellow
 
-     `CRITICAL`                             Magenta
 
-     `ERROR`                                Red
 
-     =====================================  =====================================
 
-     This is only enabled when the log output is a tty.
 
-     You can explicitly enable/disable this feature using the
 
-     :setting:`CELERYD_LOG_COLOR` setting.
 
- * Added support for task router classes (like the django multi-db routers)
 
-     * New setting: :setting:`CELERY_ROUTES`
 
-     This is a single, or a list of routers to traverse when
 
-     sending tasks. Dictionaries in this list converts to a
 
-     :class:`celery.routes.MapRoute` instance.
 
-     Examples:
 
-         >>> CELERY_ROUTES = {'celery.ping': 'default',
 
-                              'mytasks.add': 'cpu-bound',
 
-                              'video.encode': {
 
-                                  'queue': 'video',
 
-                                  'exchange': 'media'
 
-                                  'routing_key': 'media.video.encode'}}
 
-         >>> CELERY_ROUTES = ('myapp.tasks.Router',
 
-                              {'celery.ping': 'default})
 
-     Where `myapp.tasks.Router` could be:
 
-     .. code-block:: python
 
-         class Router(object):
 
-             def route_for_task(self, task, args=None, kwargs=None):
 
-                 if task == 'celery.ping':
 
-                     return 'default'
 
-     route_for_task may return a string or a dict. A string then means
 
-     it's a queue name in :setting:`CELERY_QUEUES`, a dict means it's a custom route.
 
-     When sending tasks, the routers are consulted in order. The first
 
-     router that doesn't return `None` is the route to use. The message options
 
-     is then merged with the found route settings, where the routers settings
 
-     have priority.
 
-     Example if :func:`~celery.execute.apply_async` has these arguments:
 
-     .. code-block:: pycon
 
-        >>> Task.apply_async(immediate=False, exchange='video',
 
-        ...                  routing_key='video.compress')
 
-     and a router returns:
 
-     .. code-block:: python
 
-         {'immediate': True,
 
-          'exchange': 'urgent'}
 
-     the final message options will be:
 
-     .. code-block:: pycon
 
-         >>> task.apply_async(
 
-         ...    immediate=True,
 
-         ...    exchange='urgent',
 
-         ...    routing_key='video.compress',
 
-         ... )
 
-     (and any default message options defined in the
 
-     :class:`~celery.task.base.Task` class)
 
- * New Task handler called after the task returns:
 
-   :meth:`~celery.task.base.Task.after_return`.
 
- * :class:`~billiard.einfo.ExceptionInfo` now passed to
 
-    :meth:`~celery.task.base.Task.on_retry`/
 
-    :meth:`~celery.task.base.Task.on_failure` as ``einfo`` keyword argument.
 
- * Worker: Added :setting:`CELERYD_MAX_TASKS_PER_CHILD` /
 
-   :option:`celery worker --maxtasksperchild`
 
-     Defines the maximum number of tasks a pool worker can process before
 
-     the process is terminated and replaced by a new one.
 
- * Revoked tasks now marked with state :state:`REVOKED`, and `result.get()`
 
-   will now raise :exc:`~@TaskRevokedError`.
 
- * :func:`celery.task.control.ping` now works as expected.
 
- * `apply(throw=True)` / :setting:`CELERY_EAGER_PROPAGATES_EXCEPTIONS`:
 
-   Makes eager execution re-raise task errors.
 
- * New signal: :signal:`~celery.signals.worker_process_init`: Sent inside the
 
-   pool worker process at init.
 
- * Worker: :option:`celery worker -Q` option: Ability to specify list of queues
 
-   to use, disabling other configured queues.
 
-     For example, if :setting:`CELERY_QUEUES` defines four
 
-     queues: `image`, `video`, `data` and `default`, the following
 
-     command would make the worker only consume from the `image` and `video`
 
-     queues:
 
-     .. code-block:: console
 
-         $ celeryd -Q image,video
 
- * Worker: New return value for the `revoke` control command:
 
-     Now returns:
 
-     .. code-block:: python
 
-         {'ok': 'task $id revoked'}
 
-     instead of :const:`True`.
 
- * Worker: Can now enable/disable events using remote control
 
-     Example usage:
 
-         >>> from celery.task.control import broadcast
 
-         >>> broadcast('enable_events')
 
-         >>> broadcast('disable_events')
 
- * Removed top-level tests directory. Test config now in celery.tests.config
 
-     This means running the unit tests doesn't require any special setup.
 
-     `celery/tests/__init__` now configures the :envvar:`CELERY_CONFIG_MODULE`
 
-     and :envvar:`CELERY_LOADER` environment variables, so when `nosetests`
 
-     imports that, the unit test environment is all set up.
 
-     Before you run the tests you need to install the test requirements:
 
-     .. code-block:: console
 
-         $ pip install -r requirements/test.txt
 
-     Running all tests:
 
-     .. code-block:: console
 
-         $ nosetests
 
-     Specifying the tests to run:
 
-     .. code-block:: console
 
-         $ nosetests celery.tests.test_task
 
-     Producing HTML coverage:
 
-     .. code-block:: console
 
-         $ nosetests --with-coverage3
 
-     The coverage output is then located in `celery/tests/cover/index.html`.
 
- * Worker: New option `--version`: Dump version info and exit.
 
- * :mod:`celeryd-multi <celeryd.bin.multi>`: Tool for shell scripts
 
-   to start multiple workers.
 
-     Some examples:
 
-     - Advanced example with 10 workers:
 
-         * Three of the workers processes the images and video queue
 
-         * Two of the workers processes the data queue with loglevel DEBUG
 
-         * the rest processes the default' queue.
 
-         .. code-block:: console
 
-             $ celeryd-multi start 10 -l INFO -Q:1-3 images,video -Q:4,5:data -Q default -L:4,5 DEBUG
 
-     - Get commands to start 10 workers, with 3 processes each
 
-         .. code-block:: console
 
-             $ celeryd-multi start 3 -c 3
 
-             celeryd -n celeryd1.myhost -c 3
 
-             celeryd -n celeryd2.myhost -c 3
 
-             celeryd -n celeryd3.myhost -c 3
 
-     - Start 3 named workers
 
-         .. code-block:: console
 
-             $ celeryd-multi start image video data -c 3
 
-             celeryd -n image.myhost -c 3
 
-             celeryd -n video.myhost -c 3
 
-             celeryd -n data.myhost -c 3
 
-     - Specify custom hostname
 
-         .. code-block:: console
 
-             $ celeryd-multi start 2 -n worker.example.com -c 3
 
-             celeryd -n celeryd1.worker.example.com -c 3
 
-             celeryd -n celeryd2.worker.example.com -c 3
 
-         Additional options are added to each ``celeryd``,
 
-         but you can also modify the options for ranges of or single workers
 
-     - 3 workers: Two with 3 processes, and one with 10 processes.
 
-         .. code-block:: console
 
-             $ celeryd-multi start 3 -c 3 -c:1 10
 
-             celeryd -n celeryd1.myhost -c 10
 
-             celeryd -n celeryd2.myhost -c 3
 
-             celeryd -n celeryd3.myhost -c 3
 
-     - Can also specify options for named workers
 
-         .. code-block:: console
 
-             $ celeryd-multi start image video data -c 3 -c:image 10
 
-             celeryd -n image.myhost -c 10
 
-             celeryd -n video.myhost -c 3
 
-             celeryd -n data.myhost -c 3
 
-     - Ranges and lists of workers in options is also allowed:
 
-       (``-c:1-3`` can also be written as ``-c:1,2,3``)
 
-         .. code-block:: console
 
-             $ celeryd-multi start 5 -c 3  -c:1-3 10
 
-             celeryd-multi -n celeryd1.myhost -c 10
 
-             celeryd-multi -n celeryd2.myhost -c 10
 
-             celeryd-multi -n celeryd3.myhost -c 10
 
-             celeryd-multi -n celeryd4.myhost -c 3
 
-             celeryd-multi -n celeryd5.myhost -c 3
 
-     - Lists also work with named workers:
 
-         .. code-block:: console
 
-             $ celeryd-multi start foo bar baz xuzzy -c 3 -c:foo,bar,baz 10
 
-             celeryd-multi -n foo.myhost -c 10
 
-             celeryd-multi -n bar.myhost -c 10
 
-             celeryd-multi -n baz.myhost -c 10
 
-             celeryd-multi -n xuzzy.myhost -c 3
 
- * The worker now calls the result backends `process_cleanup` method
 
-   *after* task execution instead of before.
 
- * AMQP result backend now supports Pika.
 
 
  |