states.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # -*- coding: utf-8 -*-
  2. """Built-in task states.
  3. .. _states:
  4. States
  5. ------
  6. See :ref:`task-states`.
  7. .. _statesets:
  8. Sets
  9. ----
  10. .. state:: READY_STATES
  11. READY_STATES
  12. ~~~~~~~~~~~~
  13. Set of states meaning the task result is ready (has been executed).
  14. .. state:: UNREADY_STATES
  15. UNREADY_STATES
  16. ~~~~~~~~~~~~~~
  17. Set of states meaning the task result is not ready (hasn't been executed).
  18. .. state:: EXCEPTION_STATES
  19. EXCEPTION_STATES
  20. ~~~~~~~~~~~~~~~~
  21. Set of states meaning the task returned an exception.
  22. .. state:: PROPAGATE_STATES
  23. PROPAGATE_STATES
  24. ~~~~~~~~~~~~~~~~
  25. Set of exception states that should propagate exceptions to the user.
  26. .. state:: ALL_STATES
  27. ALL_STATES
  28. ~~~~~~~~~~
  29. Set of all possible states.
  30. Misc
  31. ----
  32. """
  33. from __future__ import absolute_import, unicode_literals
  34. __all__ = (
  35. 'PENDING', 'RECEIVED', 'STARTED', 'SUCCESS', 'FAILURE',
  36. 'REVOKED', 'RETRY', 'IGNORED', 'READY_STATES', 'UNREADY_STATES',
  37. 'EXCEPTION_STATES', 'PROPAGATE_STATES', 'precedence', 'state',
  38. )
  39. #: State precedence.
  40. #: None represents the precedence of an unknown state.
  41. #: Lower index means higher precedence.
  42. PRECEDENCE = [
  43. 'SUCCESS',
  44. 'FAILURE',
  45. None,
  46. 'REVOKED',
  47. 'STARTED',
  48. 'RECEIVED',
  49. 'REJECTED',
  50. 'RETRY',
  51. 'PENDING',
  52. ]
  53. #: Hash lookup of PRECEDENCE to index
  54. PRECEDENCE_LOOKUP = dict(zip(PRECEDENCE, range(0, len(PRECEDENCE))))
  55. NONE_PRECEDENCE = PRECEDENCE_LOOKUP[None]
  56. def precedence(state):
  57. """Get the precedence index for state.
  58. Lower index means higher precedence.
  59. """
  60. try:
  61. return PRECEDENCE_LOOKUP[state]
  62. except KeyError:
  63. return NONE_PRECEDENCE
  64. class state(str):
  65. """Task state.
  66. State is a subclass of :class:`str`, implementing comparison
  67. methods adhering to state precedence rules::
  68. >>> from celery.states import state, PENDING, SUCCESS
  69. >>> state(PENDING) < state(SUCCESS)
  70. True
  71. Any custom state is considered to be lower than :state:`FAILURE` and
  72. :state:`SUCCESS`, but higher than any of the other built-in states::
  73. >>> state('PROGRESS') > state(STARTED)
  74. True
  75. >>> state('PROGRESS') > state('SUCCESS')
  76. False
  77. """
  78. def __gt__(self, other):
  79. return precedence(self) < precedence(other)
  80. def __ge__(self, other):
  81. return precedence(self) <= precedence(other)
  82. def __lt__(self, other):
  83. return precedence(self) > precedence(other)
  84. def __le__(self, other):
  85. return precedence(self) >= precedence(other)
  86. #: Task state is unknown (assumed pending since you know the id).
  87. PENDING = 'PENDING'
  88. #: Task was received by a worker (only used in events).
  89. RECEIVED = 'RECEIVED'
  90. #: Task was started by a worker (:setting:`task_track_started`).
  91. STARTED = 'STARTED'
  92. #: Task succeeded
  93. SUCCESS = 'SUCCESS'
  94. #: Task failed
  95. FAILURE = 'FAILURE'
  96. #: Task was revoked.
  97. REVOKED = 'REVOKED'
  98. #: Task was rejected (only used in events).
  99. REJECTED = 'REJECTED'
  100. #: Task is waiting for retry.
  101. RETRY = 'RETRY'
  102. IGNORED = 'IGNORED'
  103. READY_STATES = frozenset({SUCCESS, FAILURE, REVOKED})
  104. UNREADY_STATES = frozenset({PENDING, RECEIVED, STARTED, REJECTED, RETRY})
  105. EXCEPTION_STATES = frozenset({RETRY, FAILURE, REVOKED})
  106. PROPAGATE_STATES = frozenset({FAILURE, REVOKED})
  107. ALL_STATES = frozenset({
  108. PENDING, RECEIVED, STARTED, SUCCESS, FAILURE, RETRY, REVOKED,
  109. })