defaults.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import sys
  2. from datetime import timedelta
  3. is_jython = sys.platform.startswith("java")
  4. is_pypy = hasattr(sys, "pypy_version_info")
  5. DEFAULT_POOL = "processes"
  6. if is_jython:
  7. DEFAULT_POOL = "threads"
  8. elif is_pypy:
  9. DEFAULT_POOL = "solo"
  10. DEFAULT_PROCESS_LOG_FMT = """
  11. [%(asctime)s: %(levelname)s/%(processName)s] %(message)s
  12. """.strip()
  13. DEFAULT_LOG_FMT = '[%(asctime)s: %(levelname)s] %(message)s'
  14. DEFAULT_TASK_LOG_FMT = """[%(asctime)s: %(levelname)s/%(processName)s] \
  15. %(task_name)s[%(task_id)s]: %(message)s"""
  16. def str_to_bool(term, table={"false": False, "no": False, "0": False,
  17. "true": True, "yes": True, "1": True}):
  18. try:
  19. return table[term.lower()]
  20. except KeyError:
  21. raise TypeError("%r can not be converted to type bool" % (term, ))
  22. class Option(object):
  23. typemap = dict(string=str, int=int, float=float, any=lambda v: v,
  24. bool=str_to_bool, dict=dict, tuple=tuple)
  25. def __init__(self, default=None, *args, **kwargs):
  26. self.default = default
  27. self.type = kwargs.get("type") or "string"
  28. def to_python(self, value):
  29. return self.typemap[self.type](value)
  30. NAMESPACES = {
  31. "BROKER": {
  32. "HOST": Option("localhost"),
  33. "PORT": Option(type="int"),
  34. "USER": Option("guest"),
  35. "PASSWORD": Option("guest"),
  36. "VHOST": Option("/"),
  37. "BACKEND": Option(),
  38. "CONNECTION_TIMEOUT": Option(4, type="int"),
  39. "CONNECTION_RETRY": Option(True, type="bool"),
  40. "CONNECTION_MAX_RETRIES": Option(100, type="int"),
  41. "POOL_LIMIT": Option(10, type="int"),
  42. "INSIST": Option(False, type="bool"),
  43. "USE_SSL": Option(False, type="bool"),
  44. },
  45. "CELERY": {
  46. "ACKS_LATE": Option(False, type="bool"),
  47. "ALWAYS_EAGER": Option(False, type="bool"),
  48. "AMQP_TASK_RESULT_EXPIRES": Option(type="int"),
  49. "AMQP_TASK_RESULT_CONNECTION_MAX": Option(1, type="int"),
  50. "BROADCAST_QUEUE": Option("celeryctl"),
  51. "BROADCAST_EXCHANGE": Option("celeryctl"),
  52. "BROADCAST_EXCHANGE_TYPE": Option("fanout"),
  53. "CACHE_BACKEND": Option(),
  54. "CACHE_BACKEND_OPTIONS": Option({}, type="dict"),
  55. "CREATE_MISSING_QUEUES": Option(True, type="bool"),
  56. "DEFAULT_RATE_LIMIT": Option(type="string"),
  57. "DISABLE_RATE_LIMITS": Option(False, type="bool"),
  58. "DEFAULT_ROUTING_KEY": Option("celery"),
  59. "DEFAULT_QUEUE": Option("celery"),
  60. "DEFAULT_EXCHANGE": Option("celery"),
  61. "DEFAULT_EXCHANGE_TYPE": Option("direct"),
  62. "DEFAULT_DELIVERY_MODE": Option(2, type="string"),
  63. "EAGER_PROPAGATES_EXCEPTIONS": Option(False, type="bool"),
  64. "EVENT_SERIALIZER": Option("json"),
  65. "IMPORTS": Option((), type="tuple"),
  66. "IGNORE_RESULT": Option(False, type="bool"),
  67. "MAX_CACHED_RESULTS": Option(5000, type="int"),
  68. "MESSAGE_COMPRESSION": Option(None, type="string"),
  69. "RESULT_BACKEND": Option("amqp"),
  70. "RESULT_DBURI": Option(),
  71. "RESULT_ENGINE_OPTIONS": Option(None, type="dict"),
  72. "RESULT_EXCHANGE": Option("celeryresults"),
  73. "RESULT_EXCHANGE_TYPE": Option("direct"),
  74. "RESULT_SERIALIZER": Option("pickle"),
  75. "RESULT_PERSISTENT": Option(False, type="bool"),
  76. "ROUTES": Option(None, type="any"),
  77. "SEND_EVENTS": Option(False, type="bool"),
  78. "SEND_TASK_ERROR_EMAILS": Option(False, type="bool"),
  79. "SEND_TASK_SENT_EVENT": Option(False, type="bool"),
  80. "STORE_ERRORS_EVEN_IF_IGNORED": Option(False, type="bool"),
  81. "TASK_ERROR_WHITELIST": Option((), type="tuple"),
  82. "TASK_PUBLISH_RETRY": Option(True, type="bool"),
  83. "TASK_PUBLISH_RETRY_POLICY": Option({
  84. "max_retries": 100,
  85. "interval_start": 0,
  86. "interval_max": 1,
  87. "interval_step": 0.2}, type="dict"),
  88. "TASK_RESULT_EXPIRES": Option(timedelta(days=1), type="int"),
  89. "TASK_SERIALIZER": Option("pickle"),
  90. "TRACK_STARTED": Option(False, type="bool"),
  91. "REDIRECT_STDOUTS": Option(True, type="bool"),
  92. "REDIRECT_STDOUTS_LEVEL": Option("WARNING"),
  93. "QUEUES": Option(None, type="dict"),
  94. },
  95. "CELERYD": {
  96. "AUTOSCALER": Option("celery.worker.autoscale.Autoscaler"),
  97. "CONCURRENCY": Option(0, type="int"),
  98. "ETA_SCHEDULER": Option(None, type="str"),
  99. "ETA_SCHEDULER_PRECISION": Option(1.0, type="float"),
  100. "HIJACK_ROOT_LOGGER": Option(True, type="bool"),
  101. "CONSUMER": Option("celery.worker.consumer.Consumer"),
  102. "LOG_FORMAT": Option(DEFAULT_PROCESS_LOG_FMT),
  103. "LOG_COLOR": Option(type="bool"),
  104. "LOG_LEVEL": Option("WARN"),
  105. "LOG_FILE": Option(),
  106. "MEDIATOR": Option("celery.worker.controllers.Mediator"),
  107. "MAX_TASKS_PER_CHILD": Option(type="int"),
  108. "POOL": Option(DEFAULT_POOL),
  109. "POOL_PUTLOCKS": Option(True, type="bool"),
  110. "PREFETCH_MULTIPLIER": Option(4, type="int"),
  111. "STATE_DB": Option(),
  112. "TASK_LOG_FORMAT": Option(DEFAULT_TASK_LOG_FMT),
  113. "TASK_SOFT_TIME_LIMIT": Option(type="int"),
  114. "TASK_TIME_LIMIT": Option(type="int"),
  115. },
  116. "CELERYBEAT": {
  117. "SCHEDULE": Option({}, type="dict"),
  118. "SCHEDULER": Option("celery.beat.PersistentScheduler"),
  119. "SCHEDULE_FILENAME": Option("celerybeat-schedule"),
  120. "MAX_LOOP_INTERVAL": Option(5 * 60, type="int"),
  121. "LOG_LEVEL": Option("INFO"),
  122. "LOG_FILE": Option(),
  123. },
  124. "CELERYMON": {
  125. "LOG_LEVEL": Option("INFO"),
  126. "LOG_FILE": Option(),
  127. "LOG_FORMAT": Option(DEFAULT_LOG_FMT),
  128. },
  129. "EMAIL": {
  130. "HOST": Option("localhost"),
  131. "PORT": Option(25, type="int"),
  132. "HOST_USER": Option(None),
  133. "HOST_PASSWORD": Option(None),
  134. "TIMEOUT": Option(2, type="int"),
  135. },
  136. "SERVER_EMAIL": Option("celery@localhost"),
  137. "ADMINS": Option((), type="tuple"),
  138. }
  139. def _flatten(d, ns=""):
  140. acc = []
  141. for key, value in d.iteritems():
  142. if isinstance(value, dict):
  143. acc.extend(_flatten(value, ns=key + '_'))
  144. else:
  145. acc.append((ns + key, value.default))
  146. return acc
  147. DEFAULTS = dict(_flatten(NAMESPACES))