title: Running "unique" tasks with celery
body: <p>I use celery to update RSS feeds in my news aggregation site. I use one @task for each feed, and things seem to work nicely.</p>
  
  <p>There's a detail that I'm not sure to handle well though: all feeds are updated once every minute with a @periodic_task, but what if a feed is still updating from the last periodic task when a new one is started ? (for example if the feed is really slow, or offline and the task is held in a retry loop)</p>
  
  <p>Currently I store tasks results and check their status like this:</p>
  
  <pre><code>import socket
  from datetime import timedelta
  from celery.decorators import task, periodic_task
  from aggregator.models import Feed
  
  
  _results = {}
  
  
  @periodic_task(run_every=timedelta(minutes=1))
  def fetch_articles():
      for feed in Feed.objects.all():
          if feed.pk in _results:
              if not _results[feed.pk].ready():
                  # The task is not finished yet
                  continue
          _results[feed.pk] = update_feed.delay(feed)
  
  
  @task()
  def update_feed(feed):
      try:
          feed.fetch_articles()
      except socket.error, exc:
          update_feed.retry(args=[feed], exc=exc)
  </code></pre>
  
  <p>Maybe there is a more sophisticated/robust way of achieving the same result using some celery mechanism that I missed ?</p>