|  | @@ -27,23 +27,23 @@ To read more about Celery you should go read the :ref:`introduction <intro>`.
 | 
	
		
			
				|  |  |  While this version is backward compatible with previous versions
 | 
	
		
			
				|  |  |  it's important that you read the following section.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -This version is officially supported on CPython 2.6, 2.7, 3.2 and 3.3,
 | 
	
		
			
				|  |  | -as well as PyPy and Jython.
 | 
	
		
			
				|  |  | +This version is officially supported on CPython 2.6, 2.7 and 3.3,
 | 
	
		
			
				|  |  | +and also supported on PyPy.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Highlights
 | 
	
		
			
				|  |  |  ==========
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. topic:: Overview
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    - Massive prefork pool improvements
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      - Now supports Django out of the box.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          See the new tutorial at :ref:`django-first-steps`.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    - XXX2
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    - XXX3
 | 
	
		
			
				|  |  | +    - Extend the worker using bootsteps
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        YYY3
 | 
	
		
			
				|  |  | +    - Gossip and Mingle: Worker to worker communication.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. _`website`: http://celeryproject.org/
 | 
	
		
			
				|  |  |  .. _`django-celery changelog`:
 | 
	
	
		
			
				|  | @@ -67,8 +67,8 @@ Celery now requires Python 2.6 or later.
 | 
	
		
			
				|  |  |  We now have a dual codebase that runs on both Python 2 and 3 without
 | 
	
		
			
				|  |  |  using the ``2to3`` porting tool.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Last version to enable Pickle by default.
 | 
	
		
			
				|  |  | ------------------------------------------
 | 
	
		
			
				|  |  | +Last version to enable Pickle by default
 | 
	
		
			
				|  |  | +----------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Starting from Celery 3.2 the default serializer will be json.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -85,8 +85,8 @@ and make sure you have properly secured your broker from unwanted access
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  The worker will show a deprecation warning if you don't define this setting.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Old command-line programs removed and deprecated.
 | 
	
		
			
				|  |  | --------------------------------------------------
 | 
	
		
			
				|  |  | +Old command-line programs removed and deprecated
 | 
	
		
			
				|  |  | +------------------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  The goal is that everyone should move the new :program:`celery` umbrella
 | 
	
		
			
				|  |  |  command, so with this version we deprecate the old command names,
 | 
	
	
		
			
				|  | @@ -115,8 +115,49 @@ Please see :program:`celery --help` for help using the umbrella command.
 | 
	
		
			
				|  |  |  News
 | 
	
		
			
				|  |  |  ====
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Now supports Django out of the box.
 | 
	
		
			
				|  |  | ------------------------------------
 | 
	
		
			
				|  |  | +Prefork Pool Improvements
 | 
	
		
			
				|  |  | +-------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +These improvements are only active if you use a async capable broker
 | 
	
		
			
				|  |  | +transport.  This only includes RabbitMQ (AMQP) and Redis at this point,
 | 
	
		
			
				|  |  | +but hopefully more transports will be supported in the future.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Pool is now using one IPC queue per child process.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Previously the pool shared one queue between all child processes,
 | 
	
		
			
				|  |  | +    using a POSIX semaphore as a mutex to achieve exclusive read and write
 | 
	
		
			
				|  |  | +    access.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    The POSIX semaphore has now been removed and each child process
 | 
	
		
			
				|  |  | +    gets a dedicated queue.  This means that the worker will require more
 | 
	
		
			
				|  |  | +    file descriptors (two descriptors per process), but it also means
 | 
	
		
			
				|  |  | +    that performance is improved and we can direct work to specific child
 | 
	
		
			
				|  |  | +    processes.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    POSIX semaphores are not released when a process is killed, so killing
 | 
	
		
			
				|  |  | +    processes could lead to a deadlock if it happened while the semaphore was
 | 
	
		
			
				|  |  | +    acquired.  There is no good solution to fix this, so the best option
 | 
	
		
			
				|  |  | +    was to remove the semaphore.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Asynchronous write operations
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    The pool now uses async I/O to send work to the child processes.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Lost process detection is now immediate.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    If a child process was killed or exited mysteriously the pool previously
 | 
	
		
			
				|  |  | +    had to wait for 30 seconds before marking the task with a
 | 
	
		
			
				|  |  | +    :exc:`~celery.exceptions.WorkerLostError`.  It had to do this because
 | 
	
		
			
				|  |  | +    the outqueue was shared between all processes, and the pool could not
 | 
	
		
			
				|  |  | +    be certain whether the process completed the task or not.  So an arbitrary
 | 
	
		
			
				|  |  | +    timeout of 30 seconds was chosen, as it was believed that the outqueue
 | 
	
		
			
				|  |  | +    would have been drained by this point.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    This timeout is no longer necessary, and so the task can be marked as
 | 
	
		
			
				|  |  | +    failed as soon as the pool gets the notification that the process exited.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Now supports Django out of the box
 | 
	
		
			
				|  |  | +----------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  The fixes and improvements applied by the django-celery library is now
 | 
	
		
			
				|  |  |  automatically applied by core Celery when it detects that
 | 
	
	
		
			
				|  | @@ -140,104 +181,9 @@ Some features still require the :mod:`django-celery` library:
 | 
	
		
			
				|  |  |      no longer happens as a side-effect of importing the :mod:`djcelery`
 | 
	
		
			
				|  |  |      module.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Multiprocessing Pool improvements
 | 
	
		
			
				|  |  | ----------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -XXX TODO TODO BLABLABLABLA
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -:mod:`pytz` replaces ``python-dateutil`` dependency.
 | 
	
		
			
				|  |  | -----------------------------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Celery no longer depends on the ``python-dateutil`` library,
 | 
	
		
			
				|  |  | -but instead a new dependency on the :mod:`pytz` library was added.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The :mod:`pytz` library was already recommended for accurate timezone support.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -This also means that dependencies are the same for both Python 2 and
 | 
	
		
			
				|  |  | -Python 3, and that the :file:`requirements/default-py3k.txt` file has
 | 
	
		
			
				|  |  | -been removed.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Bootsteps: Extending the worker
 | 
	
		
			
				|  |  | --------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -By writing bootsteps you can now easily extend the consumer part
 | 
	
		
			
				|  |  | -of the worker to add additional features, or even message consumers.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -The worker has been using bootsteps for some time, but these were never
 | 
	
		
			
				|  |  | -documented.  In this version the consumer part of the worker
 | 
	
		
			
				|  |  | -has also been rewritten to use bootsteps and the new :ref:`guide-extending`
 | 
	
		
			
				|  |  | -guide documents examples extending the worker, including adding
 | 
	
		
			
				|  |  | -custom message consumers.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -See the :ref:`guide-extending` guide for more information.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. note::
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    Bootsteps written for older versions will not be compatible
 | 
	
		
			
				|  |  | -    with this version, as the API has changed significantly.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    The old API was experimental and internal so hopefully no one
 | 
	
		
			
				|  |  | -    is depending.  Should you happen to be using it then please
 | 
	
		
			
				|  |  | -    contact the mailing-list and we will help you port to the new version.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -New result backend with RPC semantics
 | 
	
		
			
				|  |  | --------------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -This version of the ``amqp`` result backend is a very good alternative
 | 
	
		
			
				|  |  | -to use in classical RPC scenarios, where the process that initiates
 | 
	
		
			
				|  |  | -the task is always the process to retrieve the result.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -It uses Kombu to send and retrieve results, and each client
 | 
	
		
			
				|  |  | -will create a unique queue for replies to be sent to. Avoiding
 | 
	
		
			
				|  |  | -the significant overhead of the original amqp backend which creates
 | 
	
		
			
				|  |  | -one queue per task.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Results sent using this backend is not persistent, and so will
 | 
	
		
			
				|  |  | -not survive a broker restart, but you can set
 | 
	
		
			
				|  |  | -the :setting:`CELERY_RESULT_PERSISTENT` setting to change that.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: python
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    CELERY_RESULT_BACKEND = 'rpc'
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Note that chords are currently not supported by the RPC backend.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Time limits can now be set by the client.
 | 
	
		
			
				|  |  | +Events are now ordered using logical time
 | 
	
		
			
				|  |  |  -----------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -You can set both hard and soft time limits using the ``time_limit`` and
 | 
	
		
			
				|  |  | -``soft_time_limit`` calling options:
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -.. code-block:: python
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    >>> res = add.apply_async((2, 2), time_limit=10, soft_time_limit=8)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    >>> res = add.subtask((2, 2), time_limit=10, soft_time_limit=8).delay()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    >>> res = add.s(2, 2).set(time_limit=10, soft_time_limit=8).delay()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Contributed by Mher Movsisyan.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Redis: Broadcast messages and virtual hosts.
 | 
	
		
			
				|  |  | ---------------------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Broadcast messages are seen by all virtual hosts when using the Redis
 | 
	
		
			
				|  |  | -transport.  You can fix this by enabling a prefix to all channels
 | 
	
		
			
				|  |  | -so that the messages are separated by virtual host::
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Note that you will not be able to communicate with workers running older
 | 
	
		
			
				|  |  | -versions or workers that does not have this setting enabled.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -This setting will be the default in the future, so better to migrate
 | 
	
		
			
				|  |  | -sooner rather than later.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Related to Issue #1490.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Events are now ordered using logical time.
 | 
	
		
			
				|  |  | -------------------------------------------
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  Timestamps are not a reliable way to order events in a distributed system,
 | 
	
		
			
				|  |  |  for one the floating point value does not have enough precision, but
 | 
	
		
			
				|  |  |  also it's impossible to keep physical clocks in sync.
 | 
	
	
		
			
				|  | @@ -250,14 +196,14 @@ The logical clock is currently implemented using Lamport timestamps,
 | 
	
		
			
				|  |  |  which does not have a high degree of accuracy, but should be good
 | 
	
		
			
				|  |  |  enough to casually order the events.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Also, events now records timezone information for better timestamp
 | 
	
		
			
				|  |  | -accuracy, where a new ``utcoffset`` field is included in the event.
 | 
	
		
			
				|  |  | +Also, events now record timezone information
 | 
	
		
			
				|  |  | +by including a new ``utcoffset`` field in the event message.
 | 
	
		
			
				|  |  |  This is a signed integer telling the difference from UTC time in hours,
 | 
	
		
			
				|  |  |  so e.g. an even sent from the Europe/London timezone in daylight savings
 | 
	
		
			
				|  |  |  time will have an offset of 1.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  :class:`@events.Receiver` will automatically convert the timestamps
 | 
	
		
			
				|  |  | -to the destination timezone.
 | 
	
		
			
				|  |  | +to the local timezone.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. note::
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -276,10 +222,10 @@ to the destination timezone.
 | 
	
		
			
				|  |  |      though, as even in the most busy clusters it may take several
 | 
	
		
			
				|  |  |      millennia before the clock exceeds a 64 bits value.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -New worker node name format (``name@host``).
 | 
	
		
			
				|  |  | --------------------------------------------------------------------------
 | 
	
		
			
				|  |  | +New worker node name format (``name@host``)
 | 
	
		
			
				|  |  | +-------------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Node names are now constructed by a node name and a hostname separated by '@'.
 | 
	
		
			
				|  |  | +Node names are now constructed by two elements: name and hostname separated by '@'.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  This change was made to more easily identify multiple instances running
 | 
	
		
			
				|  |  |  on the same machine.
 | 
	
	
		
			
				|  | @@ -351,28 +297,150 @@ instead (``send_twitter_status.retry``), but this could lead to problems
 | 
	
		
			
				|  |  |  in some instances where the registered task was no longer the same
 | 
	
		
			
				|  |  |  object.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Gossip: Worker <-> Worker communication.
 | 
	
		
			
				|  |  | -----------------------------------------
 | 
	
		
			
				|  |  | +Mingle: Startup synchronization
 | 
	
		
			
				|  |  | +-------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Worker now synchronizes with other workers in the same cluster.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Workers now synchronizes revoked tasks with its neighbors.
 | 
	
		
			
				|  |  | +Synchronized data currently includes revoked tasks and logical clock.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -This happens at startup and causes a one second startup delay
 | 
	
		
			
				|  |  | +This only happens at startup and causes a one second startup delay
 | 
	
		
			
				|  |  |  to collect broadcast responses from other workers.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Now supports Setuptools extra requirements.
 | 
	
		
			
				|  |  | +You can disable this bootstep using the ``--without-mingle`` argument.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Gossip: Worker <-> Worker communication
 | 
	
		
			
				|  |  | +---------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Workers are now passively subscribing to worker related events like
 | 
	
		
			
				|  |  | +heartbeats.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This means that a worker will know what other workers are doing and
 | 
	
		
			
				|  |  | +can detect when they go offline.  Currently this is only used for clock
 | 
	
		
			
				|  |  | +synchronization, but there are many possibilities for future additions
 | 
	
		
			
				|  |  | +and you can write extensions that take advantage of this already.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Some ideas include consensus protocols, reroute task to best worker (based on
 | 
	
		
			
				|  |  | +resource usage or data locality) or restarting workers when they crash.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +We believe that this is a small addition but one that may redefine everything.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +You can disable this bootstep using the ``--without-gossip`` argument.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Bootsteps: Extending the worker
 | 
	
		
			
				|  |  | +-------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +By writing bootsteps you can now easily extend the consumer part
 | 
	
		
			
				|  |  | +of the worker to add additional features, or even message consumers.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The worker has been using bootsteps for some time, but these were never
 | 
	
		
			
				|  |  | +documented.  In this version the consumer part of the worker
 | 
	
		
			
				|  |  | +has also been rewritten to use bootsteps and the new :ref:`guide-extending`
 | 
	
		
			
				|  |  | +guide documents examples extending the worker, including adding
 | 
	
		
			
				|  |  | +custom message consumers.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +See the :ref:`guide-extending` guide for more information.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. note::
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Bootsteps written for older versions will not be compatible
 | 
	
		
			
				|  |  | +    with this version, as the API has changed significantly.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    The old API was experimental and internal but should you be so unlucky
 | 
	
		
			
				|  |  | +    to use it then please contact the mailing-list and we will help you port
 | 
	
		
			
				|  |  | +    the bootstep to the new API.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +New result backend with RPC semantics
 | 
	
		
			
				|  |  | +-------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This version of the ``amqp`` result backend is a very good alternative
 | 
	
		
			
				|  |  | +to use in classical RPC scenarios, where the process that initiates
 | 
	
		
			
				|  |  | +the task is always the process to retrieve the result.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +It uses Kombu to send and retrieve results, and each client
 | 
	
		
			
				|  |  | +will create a unique queue for replies to be sent to. Avoiding
 | 
	
		
			
				|  |  | +the significant overhead of the original amqp backend which creates
 | 
	
		
			
				|  |  | +one queue per task.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Results sent using this backend is not persistent, and so will
 | 
	
		
			
				|  |  | +not survive a broker restart, but you can set
 | 
	
		
			
				|  |  | +the :setting:`CELERY_RESULT_PERSISTENT` setting to change that.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: python
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    CELERY_RESULT_BACKEND = 'rpc'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Note that chords are currently not supported by the RPC backend.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Time limits can now be set by the client
 | 
	
		
			
				|  |  | +----------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +You can set both hard and soft time limits using the ``time_limit`` and
 | 
	
		
			
				|  |  | +``soft_time_limit`` calling options:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: python
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    >>> res = add.apply_async((2, 2), time_limit=10, soft_time_limit=8)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    >>> res = add.subtask((2, 2), time_limit=10, soft_time_limit=8).delay()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    >>> res = add.s(2, 2).set(time_limit=10, soft_time_limit=8).delay()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Contributed by Mher Movsisyan.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Redis: Broadcast messages and virtual hosts
 | 
	
		
			
				|  |  |  -------------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Pip now supports installing setuptools extra requirements
 | 
	
		
			
				|  |  | -so we have deprecated the old bundles, replacing them with these
 | 
	
		
			
				|  |  | -little creatures, which are more convenient since you can easily
 | 
	
		
			
				|  |  | -specify multiple extras (e.g. ``pip install celery[redis,mongodb]``).
 | 
	
		
			
				|  |  | +Broadcast messages are seen by all virtual hosts when using the Redis
 | 
	
		
			
				|  |  | +transport.  You can fix this by enabling a prefix to all channels
 | 
	
		
			
				|  |  | +so that the messages are separated by virtual host:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: python
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Note that you will not be able to communicate with workers running older
 | 
	
		
			
				|  |  | +versions or workers that does not have this setting enabled.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This setting will be the default in the future, so better to migrate
 | 
	
		
			
				|  |  | +sooner rather than later.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Related to Issue #1490.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +:mod:`pytz` replaces ``python-dateutil`` dependency
 | 
	
		
			
				|  |  | +---------------------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Celery no longer depends on the ``python-dateutil`` library,
 | 
	
		
			
				|  |  | +but instead a new dependency on the :mod:`pytz` library was added.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The :mod:`pytz` library was already recommended for accurate timezone support.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This also means that dependencies are the same for both Python 2 and
 | 
	
		
			
				|  |  | +Python 3, and that the :file:`requirements/default-py3k.txt` file has
 | 
	
		
			
				|  |  | +been removed.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Now supports Setuptools extra requirements
 | 
	
		
			
				|  |  | +------------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Pip now supports the :mod:`setuptools` extra requirements format,
 | 
	
		
			
				|  |  | +so we have removed the old bundles concept, and instead specify
 | 
	
		
			
				|  |  | +setuptools extras.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +You install extras by specifying them inside brackets:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: bash
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $ pip install celery[redis,mongodb]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The above will install the dependencies for Redis and MongoDB.  You can list
 | 
	
		
			
				|  |  | +as many extras as you want.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  +-------------+-------------------------+---------------------------+
 | 
	
		
			
				|  |  |  | Extension   | Requirement entry       | Type                      |
 | 
	
		
			
				|  |  |  +=============+=========================+===========================+
 | 
	
		
			
				|  |  |  | Redis       | ``celery[redis]``       | transport, result backend |
 | 
	
		
			
				|  |  |  +-------------+-------------------------+---------------------------+
 | 
	
		
			
				|  |  | -| MongoDB``   | ``celery[mongodb]``     | transport, result backend |
 | 
	
		
			
				|  |  | +| MongoDB     | ``celery[mongodb]``     | transport, result backend |
 | 
	
		
			
				|  |  |  +-------------+-------------------------+---------------------------+
 | 
	
		
			
				|  |  |  | CouchDB     | ``celery[couchdb]``     | transport                 |
 | 
	
		
			
				|  |  |  +-------------+-------------------------+---------------------------+
 | 
	
	
		
			
				|  | @@ -465,7 +533,7 @@ In Other News
 | 
	
		
			
				|  |  |      .. code-block:: python
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          from celery import Celery
 | 
	
		
			
				|  |  | -        from optparse import make_option as Option
 | 
	
		
			
				|  |  | +        from celery.bin import Option
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          app = Celery()
 | 
	
		
			
				|  |  |          app.user_options['worker'].add(
 | 
	
	
		
			
				|  | @@ -487,10 +555,12 @@ In Other News
 | 
	
		
			
				|  |  |      time and the internal time is greater than 15 seconds, suggesting
 | 
	
		
			
				|  |  |      that the clocks are out of sync.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- Many parts of the Celery codebase now uses a montonic clock.
 | 
	
		
			
				|  |  | +- Monotonic clock support.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    The montonic clock function is built-in starting from Python 3.4,
 | 
	
		
			
				|  |  | -    but we also have fallback implementaions for Linux and OS X.
 | 
	
		
			
				|  |  | +    A monotonic clock is now used for timeouts and scheduling.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    The monotonic clock function is built-in starting from Python 3.4,
 | 
	
		
			
				|  |  | +    but we also have fallback implementations for Linux and OS X.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - :program:`celery worker` now supports a ``--detach`` argument to start
 | 
	
		
			
				|  |  |    the worker as a daemon in the background.
 | 
	
	
		
			
				|  | @@ -499,7 +569,7 @@ In Other News
 | 
	
		
			
				|  |  |    events, which is set to the time of when the event was received.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - :class:`@events.Dispatcher` now accepts a ``groups`` argument
 | 
	
		
			
				|  |  | -  which decides a whitelist of event groups that will be sent.
 | 
	
		
			
				|  |  | +  which decides a white-list of event groups that will be sent.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      The type of an event is a string separated by '-', where the part
 | 
	
		
			
				|  |  |      before the first '-' is the group.  Currently there are only
 | 
	
	
		
			
				|  | @@ -704,7 +774,9 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - Message headers now available as part of the task request.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    Example setting and retreiving a header value::
 | 
	
		
			
				|  |  | +    Example adding and retrieving a header value:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .. code-block:: python
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          @app.task(bind=True)
 | 
	
		
			
				|  |  |          def t(self):
 | 
	
	
		
			
				|  | @@ -814,7 +886,7 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - New semi-predicate exception :exc:`~celery.exceptions.Reject`
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    This exception can be raised to reject/requeue the task message,
 | 
	
		
			
				|  |  | +    This exception can be raised to ``reject``/``requeue`` the task message,
 | 
	
		
			
				|  |  |      see :ref:`task-semipred-reject` for examples.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - :ref:`Semipredicates <task-semipredicates>` documented: (Retry/Ignore/Reject).
 | 
	
	
		
			
				|  | @@ -882,13 +954,13 @@ Fixes
 | 
	
		
			
				|  |  |  - AMQP Backend: join did not convert exceptions when using the json
 | 
	
		
			
				|  |  |    serializer.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- Worker: Workaround for unicode errors in logs (Issue #427)
 | 
	
		
			
				|  |  | +- Worker: Workaround for Unicode errors in logs (Issue #427)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - Task methods: ``.apply_async`` now works properly if args list is None
 | 
	
		
			
				|  |  |    (Issue #1459).
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- Eventlet/gevent/solo/threads pools now properly handles BaseException errors
 | 
	
		
			
				|  |  | -  raised by tasks.
 | 
	
		
			
				|  |  | +- Eventlet/gevent/solo/threads pools now properly handles :exc:`BaseException`
 | 
	
		
			
				|  |  | +  errors raised by tasks.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - Autoscale and ``pool_grow``/``pool_shrink`` remote control commands
 | 
	
		
			
				|  |  |    will now also automatically increase and decrease the consumer prefetch count.
 |