/ src / network / multiqueue.py
multiqueue.py
 1  """
 2  A queue with multiple internal subqueues.
 3  Elements are added into a random subqueue, and retrieval rotates
 4  """
 5  import random
 6  from collections import deque
 7  
 8  from six.moves import queue
 9  
10  
11  class MultiQueue(queue.Queue):
12      """A base queue class"""
13      # pylint: disable=redefined-builtin,attribute-defined-outside-init
14      defaultQueueCount = 10
15  
16      def __init__(self, maxsize=0, count=0):
17          if not count:
18              self.queueCount = MultiQueue.defaultQueueCount
19          else:
20              self.queueCount = count
21          queue.Queue.__init__(self, maxsize)
22  
23      # Initialize the queue representation
24      def _init(self, maxsize):
25          self.iter = 0
26          self.queues = []
27          for _ in range(self.queueCount):
28              self.queues.append(deque())
29  
30      def _qsize(self, len=len):
31          return len(self.queues[self.iter])
32  
33      # Put a new item in the queue
34      def _put(self, item):
35          # self.queue.append(item)
36          self.queues[random.randrange(self.queueCount)].append(  # nosec B311
37              (item))
38  
39      # Get an item from the queue
40      def _get(self):
41          return self.queues[self.iter].popleft()
42  
43      def iterate(self):
44          """Increment the iteration counter"""
45          self.iter = (self.iter + 1) % self.queueCount
46  
47      def totalSize(self):
48          """Return the total number of items in all the queues"""
49          return sum(len(x) for x in self.queues)