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)