| 
					
				 | 
			
			
				@@ -350,11 +350,12 @@ Message and routing options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Task States 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 =========== 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-A task can be in several states, and each state can have arbitrary metadata 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-attached to it. When a task moves into another state the previous state is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-forgotten about, but some transitions can be deducted, e.g. if a task is now 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-in the :state:`FAILED` state, it's implied that it was at some point in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-:state:`STARTED` state. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+During its lifetime a task will transition through several states, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and each state may have arbitrary metadata attached to it.  When a task 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+moves into another state the previous state is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+forgotten, but some transitions can be deducted, (e.g. a task now 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+in the :state:`FAILED` state, is implied to have, been in the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+:state:`STARTED` state at some point). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 There are also sets of states, like the set of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 :state:`failure states <FAILURE_STATES>`, and the set of 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -362,8 +363,9 @@ There are also sets of states, like the set of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 The client uses the membership of these sets to decide whether 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 the exception should be re-raised (:state:`PROPAGATE_STATES`), or if the result can 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-be cached (which it can if the state is ready). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+be cached (it can if the task is ready). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+You can also define :ref:`custom-states`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 .. _task-builtin-states: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -433,6 +435,31 @@ Task has been revoked. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 :propagates: Yes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Custom states 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+You can easily define your own states, all you need is a unique name. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+The name of the state is usually an uppercase string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+As an example you could have a look at 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+:mod:`abortable tasks <~celery.contrib.abortable>` wich defines 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+the :state:`ABORTED` state. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To set the state of a task you use :meth:`Task.update_state 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<celery.task.base.Task.update_state>`:: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @task 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def upload_files(filenames, **kwargs): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for i, file in enumerate(filenames): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            upload_files.update_state(kwargs["task_id"], "PROGRESS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {"current": i, "total": len(filenames)}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Here we created the state ``"PROGRESS"``, which tells any application 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+aware of this state that the task is currently in progress, and where it is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+in the process by having ``current`` and ``total`` counts as part of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+state metadata. This can then be used to create progressbars or similar. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 .. _task-how-they-work: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |