| 
					
				 | 
			
			
				@@ -52,6 +52,120 @@ for the no-execv patch to work. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 - `django-celery #122 <http://github.com/ask/django-celery/issues/122` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 - `django-celery #124 <http://github.com/ask/django-celery/issues/122` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+`group`/`chord`/`chain` are now subtasks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+---------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- The source code for these, including subtask, has been moved 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  to new module celery.canvas. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- group is no longer an alias to TaskSet, but new alltogether, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  since it was very difficult to migrate the TaskSet class to become 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  a subtask. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- A new shortcut has been added to tasks:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> task.s(arg1, arg2, kw=1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    as a shortcut to:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> task.subtask((arg1, arg2), {"kw": 1}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Tasks can be chained by using the ``|`` operator:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> (add.s(2, 2), pow.s(2)).apply_async() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Subtasks can be "evaluated" using the ``~`` operator:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> ~add.s(2, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> ~(add.s(2, 2) | pow.s(2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    is the same as:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> chain(add.s(2, 2), pow.s(2)).apply_async().get() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- A new subtask_type key has been added to the subtask dicts 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    This can be the string "chord", "group", "chain", "chunks", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    "xmap", or "xstarmap". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- maybe_subtask now uses subtask_type to reconstruct 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  the object, to be used when using non-pickle serializers. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- The logic for these operations have been moved to dedicated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tasks celery.chord, celery.chain and celery.group. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- subtask no longer inherits from AttributeDict. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    It's now a pure dict subclass with properties for attribute 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    access to the relevant keys. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- The repr's now outputs how the sequence would like imperatively:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> from celery import chord 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> (chord([add.s(i, i) for i in xrange(10)], xsum.s()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              | pow.s(2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tasks.xsum([tasks.add(0, 0), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(1, 1), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(2, 2), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(3, 3), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(4, 4), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(5, 5), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(6, 6), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(7, 7), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(8, 8), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    tasks.add(9, 9)]) | tasks.pow(2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* New :setting:`CELERYD_WORKER_LOST_WAIT` to control the timeout in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  seconds before :exc:`billiard.WorkerLostError` is raised 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  when a worker can not be signalled (Issue #595). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Contributed by Brendon Crawford. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* App instance factory methods have been converted to be cached 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  descriptors that creates a new subclass on access. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    This means that e.g. ``celery.Worker`` is an actual class 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    and will work as expected when:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        class Worker(celery.Worker): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Logging Improvements 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+-------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Logging support now conforms better with best practices. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Classes used by the worker no longer uses app.get_default_logger, but uses 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  `celery.utils.log.get_logger` which simply gets the logger not setting the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  level, and adds a NullHandler. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Loggers are no longer passed around, instead every module using logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  defines a module global logger that is used throughout. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- All loggers inherit from a common logger called "celery". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Before task.get_logger would setup a new logger for every task, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  and even set the loglevel.  This is no longer the case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    - Instead all task loggers now inherit from a common "celery.task" logger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      that is set up when programs call `setup_logging_subsystem`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    - Instead of using LoggerAdapter to augment the formatter with 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      the task_id and task_name field, the task base logger now use 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      a special formatter adding these values at runtime from the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      currently executing task. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Redirected output from stdout/stderr is now logged to a "celery.redirected" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  logger. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- In addition a few warnings.warn have been replaced with logger.warn. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+- Now avoids the 'no handlers for logger multiprocessing' warning 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Unorganized 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ----------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -228,7 +342,63 @@ Unorganized 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * ``TasksetResult.taskset_id`` renamed to ``.id`` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* ``xmap(task, sequence)`` and ``xstarmap(task, sequence)` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Returns a list of the results applying the task to every item 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    in the sequence. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Example:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> from celery import xstarmap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >>> xstarmap(add, zip(range(10), range(10)).apply_async() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* ``chunks(task, sequence, chunksize)`` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* ``group.skew()`` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* 99% Coverage 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* :setting:`CELERY_QUEUES` can now be a list/tuple of :class:`~kombu.Queue` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  instances. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Internally :attr:`@amqp.queues` is now a mapping of name/Queue instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    instead of converting on the fly. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* Can now specify connection for :class:`@control.inspect`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .. code-block:: python 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        i = celery.control.inspect(connection=BrokerConnection("redis://")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        i.active_queues() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* Module :mod:`celery.app.task` is now a module instead of a package. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    The setup.py install script will try to remove the old package, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if that doesn't work for some reason you have to remove 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    it manually, you can do so by executing the command:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ rm -r $(dirname $(python -c ' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            import celery;print(celery.__file__)'))/app/task/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* :setting:`CELERY_FORCE_EXECV` is now enabled by default. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    If the old behavior is wanted the setting can be set to False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    or the new :option:`--no-execv` to :program:`celeryd`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* Deprecated module ``celery.conf`` has been removed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* The :setting:`CELERY_TIMEZONE` now always require the :mod:`pytz` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  library to be installed (exept if the timezone is set to `UTC`). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* The Tokyo Tyrant backend has been removed and is no longer supported. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* Now uses :func:`~kombu.common.maybe_declare` to cache queue declarations. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* There is no longer a global default for the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  :setting:`CELERYBEAT_MAX_LOOP_INTERVAL` setting, it is instead 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  set by individual schedulers. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Internals 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --------- 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -253,6 +423,12 @@ Internals 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * Renamed module ``celery.abstract`` -> :mod:`celery.worker.abstract`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* Command-line docs are now parsed from the module docstrings. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* Test suite directory has been reorganized. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+* :program:`setup.py` now reads docs from the :file:`requirements/` directory. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 .. _v260-deprecations: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Deprecations 
			 |