registry.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.app.registry
  4. ~~~~~~~~~~~~~~~~~~~
  5. Registry of available tasks.
  6. """
  7. from __future__ import absolute_import
  8. import inspect
  9. from importlib import import_module
  10. from celery._state import get_current_app
  11. from celery.exceptions import NotRegistered
  12. class TaskRegistry(dict):
  13. NotRegistered = NotRegistered
  14. def __missing__(self, key):
  15. raise self.NotRegistered(key)
  16. def register(self, task):
  17. """Register a task in the task registry.
  18. The task will be automatically instantiated if not already an
  19. instance.
  20. """
  21. self[task.name] = inspect.isclass(task) and task() or task
  22. def unregister(self, name):
  23. """Unregister task by name.
  24. :param name: name of the task to unregister, or a
  25. :class:`celery.task.base.Task` with a valid `name` attribute.
  26. :raises celery.exceptions.NotRegistered: if the task has not
  27. been registered.
  28. """
  29. try:
  30. self.pop(getattr(name, 'name', name))
  31. except KeyError:
  32. raise self.NotRegistered(name)
  33. # -- these methods are irrelevant now and will be removed in 4.0
  34. def regular(self):
  35. return self.filter_types('regular')
  36. def periodic(self):
  37. return self.filter_types('periodic')
  38. def filter_types(self, type):
  39. return dict((name, task) for name, task in self.iteritems()
  40. if getattr(task, 'type', 'regular') == type)
  41. def _unpickle_task(name):
  42. return get_current_app().tasks[name]
  43. def _unpickle_task_v2(name, module=None):
  44. if module:
  45. import_module(module)
  46. return get_current_app().tasks[name]