Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

strategy.py 3.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.worker.strategy
  4. ~~~~~~~~~~~~~~~~~~~~~~
  5. Task execution strategy (optimization).
  6. """
  7. from __future__ import absolute_import
  8. import logging
  9. from kombu.async.timer import to_timestamp
  10. from kombu.utils.encoding import safe_repr
  11. from celery.utils.log import get_logger
  12. from celery.utils.timeutils import timezone
  13. from .job import Request
  14. from .state import task_reserved
  15. __all__ = ['default']
  16. logger = get_logger(__name__)
  17. def default(task, app, consumer,
  18. info=logger.info, error=logger.error, task_reserved=task_reserved,
  19. to_system_tz=timezone.to_system):
  20. Req = Request
  21. hostname = consumer.hostname
  22. connection_errors = consumer.connection_errors
  23. _does_info = logger.isEnabledFor(logging.INFO)
  24. # task event related
  25. # (optimized to avoid calling request.send_event)
  26. eventer = consumer.event_dispatcher
  27. events = eventer and eventer.enabled
  28. send_event = eventer.send
  29. task_sends_events = events and task.send_events
  30. call_at = consumer.timer.call_at
  31. apply_eta_task = consumer.apply_eta_task
  32. rate_limits_enabled = not consumer.disable_rate_limits
  33. get_bucket = consumer.task_buckets.__getitem__
  34. handle = consumer.on_task_request
  35. limit_task = consumer._limit_task
  36. def task_message_handler(message, body, ack, reject, callbacks,
  37. to_timestamp=to_timestamp):
  38. req = Req(body, on_ack=ack, on_reject=reject,
  39. app=app, hostname=hostname,
  40. eventer=eventer, task=task,
  41. connection_errors=connection_errors,
  42. message=message)
  43. if req.revoked():
  44. return
  45. if _does_info:
  46. info('Received task: %s', req)
  47. if task_sends_events:
  48. send_event(
  49. 'task-received',
  50. uuid=req.id, name=req.name,
  51. args=safe_repr(req.args), kwargs=safe_repr(req.kwargs),
  52. retries=req.request_dict.get('retries', 0),
  53. eta=req.eta and req.eta.isoformat(),
  54. expires=req.expires and req.expires.isoformat(),
  55. )
  56. if req.eta:
  57. try:
  58. if req.utc:
  59. eta = to_timestamp(to_system_tz(req.eta))
  60. else:
  61. eta = to_timestamp(req.eta, timezone.local)
  62. except OverflowError as exc:
  63. error("Couldn't convert eta %s to timestamp: %r. Task: %r",
  64. req.eta, exc, req.info(safe=True), exc_info=True)
  65. req.acknowledge()
  66. else:
  67. consumer.qos.increment_eventually()
  68. call_at(eta, apply_eta_task, (req, ), priority=6)
  69. else:
  70. if rate_limits_enabled:
  71. bucket = get_bucket(task.name)
  72. if bucket:
  73. return limit_task(req, bucket, 1)
  74. task_reserved(req)
  75. if callbacks:
  76. [callback() for callback in callbacks]
  77. handle(req)
  78. return task_message_handler