Skip to main content

How to Use Queues in Python

Queues are a fundamental data structure used for managing ordered collections of items, often employed in scenarios requiring FIFO (First-In-First-Out) behavior.

This guide explores how to get the length of a queue, convert lists to queues, create fixed-size queues, and clear queues in Python, using the collections and queue modules.

Getting the Length of a Queue

To determine the number of items currently in a queue, use different methods depending on the type of queue you are using.

1. Using len() with deque Objects

If you use collections.deque, you can use the len() function to get the length:

from collections import deque

deq = deque(['a', 'b', 'c'])
print(len(deq)) # Output: 3
  • The len() method will return the number of elements that are stored in the deque object at any given time.

2. Using qsize() with queue.Queue Objects

If you are using the queue.Queue class, use the qsize() method instead:

import queue

q = queue.Queue()
for item in range(15):
q.put(item)
print('size of queue: ', q.qsize()) # Output: 15
print(q.empty()) # Output: False
  • The qsize() method gives you the current (approximate) number of items in the queue.
  • Use the empty() method to check if the queue is empty.

Converting Lists to Queues

Often you need to create a queue from an existing list.

1. Using collections.deque

The collections.deque class is a double-ended queue. You can convert a list to a deque object directly:

from collections import deque

my_list = [1, 2, 3]
deq = deque(my_list)
print(deq) # Output: deque([1, 2, 3])

deq.append(4)
print(deq) # Output: deque([1, 2, 3, 4])
print(deq.pop()) # Output: 4
print(deq.popleft()) # Output: 1
  • The deque() constructor takes an iterable and initializes the object with the items from it.
  • The class also has atomic append(), pop() and popleft() methods for safe manipulation of the queue data.

2. Using a for Loop with queue.Queue

If you are using the queue module, use a for loop with put() to add all list items to the queue:

import queue
my_list = [1, 2, 3]
q = queue.Queue()
for item in my_list:
q.put(item)
print(q.queue) # Output: deque([1, 2, 3])
  • The Queue.put() method adds an item to the queue.
  • The queue attribute of the queue.Queue class points to a deque object.
  • Use the queue module for multi-threaded environments only.

Here are some of the common methods the deque object implements:

from collections import deque

my_list = [1, 2, 3]
deq = deque(my_list)

deq.append(4) # Append to the right
deq.appendleft(0) # Append to the left
deq.extend([5, 6]) # Extend from right with list elements
print(deq.pop()) # Remove and return element from right
print(deq.popleft()) # Remove and return element from left
print(deq) # Output: deque([1, 2, 3, 4, 5])
deq.clear()

print(deq) # Output: deque([])

Creating a Fixed-Size Queue with deque

The deque class allows you to create a fixed-size queue using the maxlen argument:

from collections import deque

deq = deque(maxlen=3)
deq.extend([1, 2, 3])
print(deq) # Output: deque([1, 2, 3], maxlen=3)

deq.append(4)
print(deq) # Output: deque([2, 3, 4], maxlen=3)

deq.appendleft(0)
print(deq) # Output: deque([0, 2, 3], maxlen=3)
  • If maxlen is provided the object will maintain that size, removing elements from the opposite end when adding new items.
  • If no maxlen argument is specified the queue can grow indefinitely.

Clearing all Items from a Queue

To remove all items from a queue, there are several different approaches.

1. Clearing a queue.Queue Object

To clear a queue created using the queue module, use the clear() method on the underlying deque object:

import queue

q = queue.Queue()
for item in range(10):
q.put(item)
print(q.queue) # Output: deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
q.queue.clear()
print(q.queue) # Output: deque([])
  • The q.queue attribute accesses the underlying deque object which has a clear() method.

2. Thread Safe Clearing

If you are using queue.Queue in a multi-threaded environment, make sure that your clear operations are thread-safe.

import queue
q = queue.Queue()
for item in range(10):
q.put(item)
with q.mutex:
q.queue.clear()
print(q.queue) # Output: deque([])
  • Use the with q.mutex: block to use a mutex lock for thread safety.

3. Creating a New Queue

Alternatively you can simply create a new queue to effectively discard the old data:

import queue
q = queue.Queue()
for item in range(10):
q.put(item)
del q
new_q = queue.Queue()
print(new_q.queue) # Output: deque([])
  • The old queue q is deleted, and a new queue new_q is created.