registry.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. from celery.five import items
  13. class TaskRegistry(dict):
  14. NotRegistered = NotRegistered
  15. def __missing__(self, key):
  16. raise self.NotRegistered(key)
  17. def register(self, task):
  18. """Register a task in the task registry.
  19. The task will be automatically instantiated if not already an
  20. instance.
  21. """
  22. self[task.name] = inspect.isclass(task) and task() or 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. self.pop(getattr(name, 'name', name))
  32. except KeyError:
  33. raise self.NotRegistered(name)
  34. # -- these methods are irrelevant now and will be removed in 4.0
  35. def regular(self):
  36. return self.filter_types('regular')
  37. def periodic(self):
  38. return self.filter_types('periodic')
  39. def filter_types(self, type):
  40. return dict((name, task) for name, task in items(self)
  41. if getattr(task, 'type', 'regular') == type)
  42. def _unpickle_task(name):
  43. return get_current_app().tasks[name]
  44. def _unpickle_task_v2(name, module=None):
  45. if module:
  46. import_module(module)
  47. return get_current_app().tasks[name]