registry.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. """celery.registry"""
  2. from celery import discovery
  3. from celery.utils import get_full_cls_name
  4. from celery.exceptions import NotRegistered, AlreadyRegistered
  5. from UserDict import UserDict
  6. class TaskRegistry(UserDict):
  7. """Site registry for tasks."""
  8. AlreadyRegistered = AlreadyRegistered
  9. NotRegistered = NotRegistered
  10. def __init__(self):
  11. self.data = {}
  12. def autodiscover(self):
  13. """Autodiscovers tasks using :func:`celery.discovery.autodiscover`."""
  14. discovery.autodiscover()
  15. def register(self, task, name=None):
  16. """Register a task in the task registry.
  17. Task can either be a regular function, or a class inheriting
  18. from :class:`celery.task.Task`.
  19. :keyword name: By default the :attr:`Task.name` attribute on the
  20. task is used as the name of the task, but you can override it
  21. using this option.
  22. :raises AlreadyRegistered: if the task is already registered.
  23. """
  24. is_class = hasattr(task, "run")
  25. if is_class:
  26. task = task() # instantiate Task class
  27. if not name:
  28. name = getattr(task, "name")
  29. if name in self.data:
  30. raise self.AlreadyRegistered(
  31. "Task with name %s is already registered." % name)
  32. if not is_class:
  33. task.name = name
  34. task.type = "regular"
  35. self.data[name] = task
  36. def unregister(self, name):
  37. """Unregister task by name.
  38. :param name: name of the task to unregister, or a
  39. :class:`celery.task.Task` class with a valid ``name`` attribute.
  40. :raises celery.exceptions.NotRegistered: if the task has not
  41. been registered.
  42. """
  43. if hasattr(name, "run"):
  44. name = name.name
  45. if name not in self.data:
  46. raise self.NotRegistered(
  47. "Task with name %s is not registered." % name)
  48. del self.data[name]
  49. def get_all(self):
  50. """Get all task types."""
  51. return self.data
  52. def filter_types(self, type):
  53. """Return all tasks of a specific type."""
  54. return dict((task_name, task)
  55. for task_name, task in self.data.items()
  56. if task.type == type)
  57. def get_all_regular(self):
  58. """Get all regular task types."""
  59. return self.filter_types(type="regular")
  60. def get_all_periodic(self):
  61. """Get all periodic task types."""
  62. return self.filter_types(type="periodic")
  63. def get_task(self, name):
  64. """Get task by name."""
  65. return self.data[name]
  66. """
  67. .. data:: tasks
  68. The global task registry.
  69. """
  70. tasks = TaskRegistry()