|  | @@ -28,49 +28,52 @@ In the consumer:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. code-block:: python
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   from celery.contrib.abortable import AbortableTask
 | 
	
		
			
				|  |  | -   from celery.utils.log import get_task_logger
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   logger = get_logger(__name__)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -   class MyLongRunningTask(AbortableTask):
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -       def run(self, **kwargs):
 | 
	
		
			
				|  |  | -           results = []
 | 
	
		
			
				|  |  | -           for x in range(100):
 | 
	
		
			
				|  |  | -               # Check after every 5 loops..
 | 
	
		
			
				|  |  | -               if x % 5 == 0:  # alternatively, check when some timer is due
 | 
	
		
			
				|  |  | -                   if self.is_aborted(**kwargs):
 | 
	
		
			
				|  |  | -                       # Respect the aborted status and terminate
 | 
	
		
			
				|  |  | -                       # gracefully
 | 
	
		
			
				|  |  | -                       logger.warning('Task aborted.')
 | 
	
		
			
				|  |  | -                       return
 | 
	
		
			
				|  |  | -               y = do_something_expensive(x)
 | 
	
		
			
				|  |  | -               results.append(y)
 | 
	
		
			
				|  |  | -           logger.info('Task finished.')
 | 
	
		
			
				|  |  | -           return results
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    from __future__ import absolute_import
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    from celery.contrib.abortable import AbortableTask
 | 
	
		
			
				|  |  | +    from celery.utils.log import get_task_logger
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    from proj.celery import app
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    logger = get_logger(__name__)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @app.task(bind=True, base=AbortableTask)
 | 
	
		
			
				|  |  | +    def long_running_task(self):
 | 
	
		
			
				|  |  | +        results = []
 | 
	
		
			
				|  |  | +        for i in range(100):
 | 
	
		
			
				|  |  | +            # check after every 5 iterations...
 | 
	
		
			
				|  |  | +            # (or alternatively, check when some timer is due)
 | 
	
		
			
				|  |  | +            if not i % 5:
 | 
	
		
			
				|  |  | +                if self.is_aborted():
 | 
	
		
			
				|  |  | +                    # respect aborted state, and terminate gracefully.
 | 
	
		
			
				|  |  | +                    logger.warning('Task aborted')
 | 
	
		
			
				|  |  | +                    return
 | 
	
		
			
				|  |  | +                value = do_something_expensive(i)
 | 
	
		
			
				|  |  | +                results.append(y)
 | 
	
		
			
				|  |  | +        logger.info('Task complete')
 | 
	
		
			
				|  |  | +        return results
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  In the producer:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. code-block:: python
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   from myproject.tasks import MyLongRunningTask
 | 
	
		
			
				|  |  | +    from __future__ import absolute_import
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   def myview(request):
 | 
	
		
			
				|  |  | +    import time
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -       async_result = MyLongRunningTask.delay()
 | 
	
		
			
				|  |  | -       # async_result is of type AbortableAsyncResult
 | 
	
		
			
				|  |  | +    from proj.tasks import MyLongRunningTask
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -       # After 10 seconds, abort the task
 | 
	
		
			
				|  |  | -       time.sleep(10)
 | 
	
		
			
				|  |  | -       async_result.abort()
 | 
	
		
			
				|  |  | +    def myview(request):
 | 
	
		
			
				|  |  | +        # result is of type AbortableAsyncResult
 | 
	
		
			
				|  |  | +        result = long_running_task.delay()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -       ...
 | 
	
		
			
				|  |  | +        # abort the task after 10 seconds
 | 
	
		
			
				|  |  | +        time.sleep(10)
 | 
	
		
			
				|  |  | +        result.abort()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -After the `async_result.abort()` call, the task execution is not
 | 
	
		
			
				|  |  | +After the `result.abort()` call, the task execution is not
 | 
	
		
			
				|  |  |  aborted immediately. In fact, it is not guaranteed to abort at all. Keep
 | 
	
		
			
				|  |  | -checking the `async_result` status, or call `async_result.wait()` to
 | 
	
		
			
				|  |  | +checking `result.state` status, or call `result.get(timeout=)` to
 | 
	
		
			
				|  |  |  have it block until the task is finished.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .. note::
 |