registry.py 1.9 KB

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