decorators.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from inspect import getargspec
  2. from billiard.utils.functional import wraps
  3. from celery.task.base import Task, PeriodicTask
  4. def task(*args, **options):
  5. """Decorator to create a task class out of any callable.
  6. Examples:
  7. .. code-block:: python
  8. @task()
  9. def refresh_feed(url):
  10. return Feed.objects.get(url=url).refresh()
  11. With setting extra options and using retry.
  12. .. code-block:: python
  13. @task(exchange="feeds")
  14. def refresh_feed(url, **kwargs):
  15. try:
  16. return Feed.objects.get(url=url).refresh()
  17. except socket.error, exc:
  18. refresh_feed.retry(args=[url], kwargs=kwargs, exc=exc)
  19. Calling the resulting task:
  20. >>> refresh_feed("http://example.com/rss") # Regular
  21. <Feed: http://example.com/rss>
  22. >>> refresh_feed.delay("http://example.com/rss") # Async
  23. <AsyncResult: 8998d0f4-da0b-4669-ba03-d5ab5ac6ad5d>
  24. """
  25. def inner_create_task_cls(**options):
  26. def _create_task_cls(fun):
  27. base = options.pop("base", Task)
  28. @wraps(fun)
  29. def run(self, *args, **kwargs):
  30. return fun(*args, **kwargs)
  31. run.argspec = getargspec(fun)
  32. cls_dict = dict(options, run=run, __module__=fun.__module__)
  33. return type(fun.__name__, (base, ), cls_dict)()
  34. return _create_task_cls
  35. if len(args) == 1 and callable(args[0]):
  36. return inner_create_task_cls()(*args)
  37. return inner_create_task_cls(**options)
  38. def periodic_task(**options):
  39. """Task decorator to create a periodic task.
  40. Run a task once every day:
  41. .. code-block:: python
  42. from datetime import timedelta
  43. @periodic_task(run_every=timedelta(days=1))
  44. def cronjob(**kwargs):
  45. logger = cronjob.get_logger(**kwargs)
  46. logger.warn("Task running...")
  47. """
  48. options.setdefault("base", PeriodicTask)
  49. return task(**options)