|  | @@ -207,13 +207,19 @@ New Task Message Protocol
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - Worker stores results and sends monitoring events for unknown task names
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- shadow
 | 
	
		
			
				|  |  | +- Worker calls callbacks/errbacks even when the result is sent by the
 | 
	
		
			
				|  |  | +  parent process (e.g. :exc:`WorkerLostError` when a child process
 | 
	
		
			
				|  |  | +  terminates).
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- argsrepr
 | 
	
		
			
				|  |  | +- origin header
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- shadow header
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- argsrepr header
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - Support for very long chains
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- parent_id / root_id
 | 
	
		
			
				|  |  | +- parent_id / root_id headers
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Prefork: Tasks now log from the child process
 | 
	
	
		
			
				|  | @@ -234,6 +240,38 @@ process has a separate log file to avoid race conditions.
 | 
	
		
			
				|  |  |  You are encouraged to upgrade your init scripts and multi arguments
 | 
	
		
			
				|  |  |  to do so also.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Ability to configure separate broker urls for read/write
 | 
	
		
			
				|  |  | +========================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +New :setting:`broker_read_url` and :setting:`broker_write_url` settings
 | 
	
		
			
				|  |  | +have been added so that separate broker urls can be provided
 | 
	
		
			
				|  |  | +for connections used for consuming/publishing.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +In addition to the configuration options, two new methods have been
 | 
	
		
			
				|  |  | +added the app API:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``app.connection_for_read()``
 | 
	
		
			
				|  |  | +    - ``app.connection_for_write()``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +These should now be used in place of ``app.connection()`` to specify
 | 
	
		
			
				|  |  | +the intent of the required connection.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. note::
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Two connection pools are available: ``app.pool`` (read), and
 | 
	
		
			
				|  |  | +``app.producer_pool`` (write).  The latter does not actually give connections
 | 
	
		
			
				|  |  | +but full :class:`kombu.Producer` instances.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: python
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def publish_some_message(app, producer=None):
 | 
	
		
			
				|  |  | +        with app.producer_or_acquire(producer) as producer:
 | 
	
		
			
				|  |  | +            ...
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def consume_messages(app, connection=None):
 | 
	
		
			
				|  |  | +        with app.connection_or_acquire(connection) as connection:
 | 
	
		
			
				|  |  | +            ...
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Canvas Refactor
 | 
	
		
			
				|  |  |  ===============
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -270,6 +308,11 @@ e442df61b2ff1fe855881c1e2ff9acc970090f54
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - Chain: Fixed bug with incorrect id set when a subtask is also a chain.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- ``group | group`` is now flattened into a single group (Issue #2573).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Fixed issue where ``group | task`` was not upgrading correctly
 | 
	
		
			
				|  |  | +  to chord (Issue #2922).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Schedule tasks based on sunrise, sunset, dawn and dusk.
 | 
	
		
			
				|  |  |  =======================================================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -290,6 +333,11 @@ RabbitMQ Priority queue support
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Contributed by Gerald Manipon.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Incompatible: Worker direct queues are no longer using auto-delete.
 | 
	
		
			
				|  |  | +===================================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Issue #2492.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Prefork: Limits for child process resident memory size.
 | 
	
		
			
				|  |  |  =======================================================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -300,9 +348,17 @@ which BLA BLA BLA
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Contributed by Dave Smith.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Redis: New optimized chord join implementation.
 | 
	
		
			
				|  |  | +Redis: Result backend optimizations
 | 
	
		
			
				|  |  |  ===============================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Pub/sub results
 | 
	
		
			
				|  |  | +---------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Contributed by Yaroslav Zhavoronkov and Ask Solem.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Chord join
 | 
	
		
			
				|  |  | +----------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  This was an experimental feature introduced in Celery 3.1,
 | 
	
		
			
				|  |  |  but is now enabled by default.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -332,6 +388,16 @@ to be using the new driver.
 | 
	
		
			
				|  |  |  # XXX What changed?
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Elasticsearch Result Backend
 | 
	
		
			
				|  |  | +============================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Contributed by Ahmet Demir.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Filesystem Result Backend
 | 
	
		
			
				|  |  | +=========================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Contributed by Môshe van der Sterre.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Event Batching
 | 
	
		
			
				|  |  |  ==============
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -383,6 +449,14 @@ Task Autoretry Decorator
 | 
	
		
			
				|  |  |  Contributed by Dmitry Malinovsky.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Async Result API
 | 
	
		
			
				|  |  | +================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +eventlet/gevent drainers, promises, BLA BLA
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Closed issue #2529.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  :setting:`task_routes` can now contain glob patterns and regexes.
 | 
	
		
			
				|  |  |  =================================================================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -399,6 +473,15 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      - No longer depends on ``anyjson`` :sadface:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- **Tasks**: The "anon-exchange" is now used for simple name-name direct routing.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  This increases performance as it completely bypasses the routing table,
 | 
	
		
			
				|  |  | +  in addition it also improves reliability for the Redis broker transport.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- **Eventlet/Gevent**: Fixed race condition leading to "simultaneous read"
 | 
	
		
			
				|  |  | + errors (Issue #2812).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **Programs**: ``%n`` format for :program:`celery multi` is now synonym with
 | 
	
		
			
				|  |  |    ``%N`` to be consistent with :program:`celery worker`.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -440,6 +523,35 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Contributed by Michael Permana.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **Worker**: Improvements and fixes for LimitedSet
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Getting rid of leaking memory + adding minlen size of the set
 | 
	
		
			
				|  |  | +    minlen is minimal residual size of set after operating for long.
 | 
	
		
			
				|  |  | +    Minlen items are kept, even if they should be expired by time, until
 | 
	
		
			
				|  |  | +    we get newer items.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Problems with older and even more old code:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    1)
 | 
	
		
			
				|  |  | +       Heap would tend to grow in some scenarios
 | 
	
		
			
				|  |  | +       (like adding an item multiple times).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    2) Adding many items fast would not clean them soon enough (if ever).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    3) When talking to other workers, revoked._data was sent, but
 | 
	
		
			
				|  |  | +       it was processed on the other side as iterable.
 | 
	
		
			
				|  |  | +       That means giving those keys new (current)
 | 
	
		
			
				|  |  | +       timestamp. By doing this workers could recycle
 | 
	
		
			
				|  |  | +       items forever. Combined with 1) and 2), this means that in
 | 
	
		
			
				|  |  | +       large set of workers, you are getting out of memory soon.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    All those problems should be fixed now,
 | 
	
		
			
				|  |  | +    also some new unittests are added.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    This should fix issues #3095, #3086.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Contributed by David Pravec.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **App**: New signals for app configuration/finalization:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      - :data:`app.on_configure <@on_configure>`
 | 
	
	
		
			
				|  | @@ -473,6 +585,10 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Contributed by Dmitry Malinovsky.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **App**: App has new ``app.current_worker_task`` property that
 | 
	
		
			
				|  |  | +  returns the task that is currently being worked on (or :const:`None`).
 | 
	
		
			
				|  |  | +  (Issue #2100).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **Tasks**: ``Task.subtask`` renamed to ``Task.signature`` with alias.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  - **Tasks**: ``Task.subtask_from_request`` renamed to
 | 
	
	
		
			
				|  | @@ -509,6 +625,9 @@ In Other News
 | 
	
		
			
				|  |  |  - **Programs**: :program:`celery multi` now passes through `%i` and `%I` log
 | 
	
		
			
				|  |  |    file formats.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **Programs**: ``%p`` can now be used to expand to the full worker nodename
 | 
	
		
			
				|  |  | + in logfile/pidfile arguments.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **Programs**: A new command line option :option:``--executable`` is now
 | 
	
		
			
				|  |  |    available for daemonizing programs.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -519,9 +638,18 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Contributed by Mickaël Penhard.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **Deployment**: Generic init scripts now support
 | 
	
		
			
				|  |  | +  :envvar:`CELERY_SU`` and :envvar:`CELERYD_SU_ARGS` environment variables
 | 
	
		
			
				|  |  | +  to set the path and arguments for :man:`su(1)`.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **Prefork**: Prefork pool now uses ``poll`` instead of ``select`` where
 | 
	
		
			
				|  |  |    available (Issue #2373).
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **Eventlet**: Now returns pool size in :program:`celery inspect stats`
 | 
	
		
			
				|  |  | +  command.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Contributed by Alexander Oblovatniy.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **Tasks**: New :setting:`email_charset` setting allows for changing
 | 
	
		
			
				|  |  |    the charset used for outgoing error emails.
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -570,6 +698,9 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Fix contributed by Allard Hoeve.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **Result Backends**: Database backend now sets max char size to 155 to deal
 | 
	
		
			
				|  |  | +  with brain damaged MySQL unicode implementation (Issue #1748).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - **General**: All Celery exceptions/warnings now inherit from common
 | 
	
		
			
				|  |  |    :class:`~celery.exceptions.CeleryException`/:class:`~celery.exceptions.CeleryWarning`.
 | 
	
		
			
				|  |  |    (Issue #2643).
 | 
	
	
		
			
				|  | @@ -578,6 +709,9 @@ In Other News
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Fix contributed by Feanil Patel.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- **Tasks**: Task error email charset now set to ``utf-8`` by default
 | 
	
		
			
				|  |  | +  (Issue #2737).
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  - Apps can now define how tasks are named (:meth:`@gen_task_name`).
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      Contributed by Dmitry Malinovsky
 | 
	
	
		
			
				|  | @@ -587,6 +721,26 @@ In Other News
 | 
	
		
			
				|  |  |  - Beat: ``Scheduler.Publisher``/``.publisher`` renamed to
 | 
	
		
			
				|  |  |    ``.Producer``/``.producer``.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Incompatible changes
 | 
	
		
			
				|  |  | +====================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Prefork: Calling ``result.get()`` or joining any result from within a task
 | 
	
		
			
				|  |  | +  now raises :exc:`RuntimeError`.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    In previous versions this would emit a warning.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- :mod:`celery.worker.consumer` is now a package, not a module.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Result: The task_name argument/attribute of :class:`@AsyncResult` was
 | 
	
		
			
				|  |  | +  removed.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    This was historically a field used for :mod:`pickle` compatibility,
 | 
	
		
			
				|  |  | +    but is no longer needed.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Backends: Arguments named ``status`` renamed to ``state``.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Backends: ``backend.get_status()`` renamed to ``backend.get_state()``.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  Unscheduled Removals
 | 
	
		
			
				|  |  |  ====================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -653,6 +807,8 @@ Result
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      - ``TaskSetResult.taskset_id`` -> ``GroupResult.id``
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +- Removed ``ResultSet.subtasks``, use ``ResultSet.results`` instead.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TaskSet
 | 
	
		
			
				|  |  |  -------
 | 
	
	
		
			
				|  | @@ -670,6 +826,78 @@ New::
 | 
	
		
			
				|  |  |      >>> from celery import group
 | 
	
		
			
				|  |  |      >>> group(add.s(i, i) for i in xrange(10))()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +Events
 | 
	
		
			
				|  |  | +------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Removals for class :class:`celery.events.state.Worker`:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Worker._defaults`` attribute.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``{k: getattr(worker, k) for k in worker._fields}``.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Worker.update_heartbeat``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Worker.event(None, timestamp, received)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Worker.on_online``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Worker.event('online', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Worker.on_offline``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Worker.event('offline', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Worker.on_heartbeat``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Worker.event('heartbeat', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- Removals for class :class:`celery.events.state.Task`:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task._defaults`` attribute.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``{k: getattr(task, k) for k in task._fields}``.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_sent``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Worker.event('sent', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_received``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event('received', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_started``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event('started', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_failed``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event('failed', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_retried``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event('retried', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_succeeded``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event('succeeded', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_revoked``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event('revoked', timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.on_unknown_event``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event(short_type, timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.update``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Use ``Task.event(short_type, timestamp, received, fields)``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    - ``Task.merge``
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Contact us if you need this.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Magic keyword arguments
 | 
	
		
			
				|  |  |  -----------------------
 |