registry.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.app.registry
  4. ~~~~~~~~~~~~~~~~~~~
  5. Registry of available tasks.
  6. :copyright: (c) 2009 - 2012 by Ask Solem.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. from __future__ import absolute_import
  10. import inspect
  11. from celery import current_app
  12. from celery.exceptions import NotRegistered
  13. class TaskRegistry(dict):
  14. NotRegistered = NotRegistered
  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. self[task.name] = inspect.isclass(task) and task() or task
  21. def unregister(self, name):
  22. """Unregister task by name.
  23. :param name: name of the task to unregister, or a
  24. :class:`celery.task.base.Task` with a valid `name` attribute.
  25. :raises celery.exceptions.NotRegistered: if the task has not
  26. been registered.
  27. """
  28. try:
  29. # Might be a task class
  30. name = name.name
  31. except AttributeError:
  32. pass
  33. self.pop(name)
  34. def pop(self, key, *args):
  35. try:
  36. return dict.pop(self, key, *args)
  37. except KeyError:
  38. raise self.NotRegistered(key)
  39. # -- these methods are irrelevant now and will be removed in 3.0
  40. def regular(self):
  41. return self.filter_types("regular")
  42. def periodic(self):
  43. return self.filter_types("periodic")
  44. def filter_types(self, type):
  45. return dict((name, task) for name, task in self.iteritems()
  46. if task.type == type)
  47. def _unpickle_task(name):
  48. return current_app.tasks[name]