registry.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. """
  2. celery.registry
  3. ===============
  4. Registry of available tasks.
  5. """
  6. from __future__ import absolute_import
  7. import inspect
  8. from .exceptions import NotRegistered
  9. __all__ = ["TaskRegistry", "tasks"]
  10. class TaskRegistry(dict):
  11. NotRegistered = NotRegistered
  12. def regular(self):
  13. """Get all regular task types."""
  14. return self.filter_types("regular")
  15. def periodic(self):
  16. """Get all periodic task types."""
  17. return self.filter_types("periodic")
  18. def register(self, task):
  19. """Register a task in the task registry.
  20. The task will be automatically instantiated if not already an
  21. instance.
  22. """
  23. self[task.name] = inspect.isclass(task) and task() or task
  24. def unregister(self, name):
  25. """Unregister task by name.
  26. :param name: name of the task to unregister, or a
  27. :class:`celery.task.base.Task` with a valid `name` attribute.
  28. :raises celery.exceptions.NotRegistered: if the task has not
  29. been registered.
  30. """
  31. try:
  32. # Might be a task class
  33. name = name.name
  34. except AttributeError:
  35. pass
  36. self.pop(name)
  37. def filter_types(self, type):
  38. """Return all tasks of a specific type."""
  39. return dict((name, task) for name, task in self.iteritems()
  40. if task.type == type)
  41. def __getitem__(self, key):
  42. try:
  43. return dict.__getitem__(self, key)
  44. except KeyError:
  45. raise self.NotRegistered(key)
  46. def pop(self, key, *args):
  47. try:
  48. return dict.pop(self, key, *args)
  49. except KeyError:
  50. raise self.NotRegistered(key)
  51. #: Global task registry.
  52. tasks = TaskRegistry()
  53. def _unpickle_task(name):
  54. return tasks[name]