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.

simple.py 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. """
  2. kombu.simple
  3. ============
  4. Simple interface.
  5. """
  6. from __future__ import absolute_import
  7. import socket
  8. from collections import deque
  9. from . import entity
  10. from . import messaging
  11. from .connection import maybe_channel
  12. from .five import Empty, monotonic
  13. __all__ = ['SimpleQueue', 'SimpleBuffer']
  14. class SimpleBase(object):
  15. Empty = Empty
  16. _consuming = False
  17. def __enter__(self):
  18. return self
  19. def __exit__(self, *exc_info):
  20. self.close()
  21. def __init__(self, channel, producer, consumer, no_ack=False):
  22. self.channel = maybe_channel(channel)
  23. self.producer = producer
  24. self.consumer = consumer
  25. self.no_ack = no_ack
  26. self.queue = self.consumer.queues[0]
  27. self.buffer = deque()
  28. self.consumer.register_callback(self._receive)
  29. def get(self, block=True, timeout=None):
  30. if not block:
  31. return self.get_nowait()
  32. self._consume()
  33. elapsed = 0.0
  34. remaining = timeout
  35. while True:
  36. time_start = monotonic()
  37. if self.buffer:
  38. return self.buffer.popleft()
  39. try:
  40. self.channel.connection.client.drain_events(
  41. timeout=timeout and remaining)
  42. except socket.timeout:
  43. raise self.Empty()
  44. elapsed += monotonic() - time_start
  45. remaining = timeout and timeout - elapsed or None
  46. def get_nowait(self):
  47. m = self.queue.get(no_ack=self.no_ack)
  48. if not m:
  49. raise self.Empty()
  50. return m
  51. def put(self, message, serializer=None, headers=None, compression=None,
  52. routing_key=None, **kwargs):
  53. self.producer.publish(message,
  54. serializer=serializer,
  55. routing_key=routing_key,
  56. headers=headers,
  57. compression=compression,
  58. **kwargs)
  59. def clear(self):
  60. return self.consumer.purge()
  61. def qsize(self):
  62. _, size, _ = self.queue.queue_declare(passive=True)
  63. return size
  64. def close(self):
  65. self.consumer.cancel()
  66. def _receive(self, message_data, message):
  67. self.buffer.append(message)
  68. def _consume(self):
  69. if not self._consuming:
  70. self.consumer.consume(no_ack=self.no_ack)
  71. self._consuming = True
  72. def __len__(self):
  73. """`len(self) -> self.qsize()`"""
  74. return self.qsize()
  75. def __bool__(self):
  76. return True
  77. __nonzero__ = __bool__
  78. class SimpleQueue(SimpleBase):
  79. no_ack = False
  80. queue_opts = {}
  81. exchange_opts = {'type': 'direct'}
  82. def __init__(self, channel, name, no_ack=None, queue_opts=None,
  83. exchange_opts=None, serializer=None,
  84. compression=None, **kwargs):
  85. queue = name
  86. queue_opts = dict(self.queue_opts, **queue_opts or {})
  87. exchange_opts = dict(self.exchange_opts, **exchange_opts or {})
  88. if no_ack is None:
  89. no_ack = self.no_ack
  90. if not isinstance(queue, entity.Queue):
  91. exchange = entity.Exchange(name, **exchange_opts)
  92. queue = entity.Queue(name, exchange, name, **queue_opts)
  93. routing_key = name
  94. else:
  95. name = queue.name
  96. exchange = queue.exchange
  97. routing_key = queue.routing_key
  98. producer = messaging.Producer(channel, exchange,
  99. serializer=serializer,
  100. routing_key=routing_key,
  101. compression=compression)
  102. consumer = messaging.Consumer(channel, queue)
  103. super(SimpleQueue, self).__init__(channel, producer,
  104. consumer, no_ack, **kwargs)
  105. class SimpleBuffer(SimpleQueue):
  106. no_ack = True
  107. queue_opts = dict(durable=False,
  108. auto_delete=True)
  109. exchange_opts = dict(durable=False,
  110. delivery_mode='transient',
  111. auto_delete=True)