Azure / Azure/azure-sdk-for-python

Add `is_empty()` method to `QueueClient`

Aperta
#44,631 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
customer-reported needs-team-attention question
Lingua principale
Python
Stelle
5.6k
Fork
3.4k
Merge medio
2g 2h
PR unite (30g)
213

Descrizione

**Is your feature request related to a problem? Please describe.**

I am frustrated by the lack of a straightforward, reliable way to check if a queue is truly empty. Currently, a common workaround is to attempt to receive a message with a short visibility timeout:

```python
def is_empty(self) -> bool:
return self.queue_client.receive_message(visibility_timeout=0) is None
```

However, this approach is flawed. It yields a false positive if the queue contains messages that are currently invisible (e.g., being processed by another worker). In this scenario, the method returns True, even though the queue is not technically empty and will have messages available again once visibility timeouts expire.

**Describe the solution you'd like**

I would like a built-in `is_empty()` method (or a similar property) on the QueueClient class. This method should ideally check the metadata of the queue to determine if there are any messages present, regardless of their visibility state.

**Additional context**

In a multi-consumer environment, the current "receive" hack causes logic errors where a system might shut down or trigger a "cleanup" task believing the work is done, while other consumers are still holding onto messages.

Below is the current wrapper implementation I am using, which highlights the need for a more robust built-in solution:

```python
class MyQueueClient():
def __init__(self, queue_name: str = "my-queue-test", connection_option: str = ""):
self.queue_service_client = (
self.__get_queue_service_from_connection_string(connection_option)
if self.__authenticate_fron_connection_str(connection_option)
else self.__get_queue_service_from_default_credential(connection_option)
)

try:
self.queue_client = self.queue_service_client.create_queue(queue_name)
except ResourceExistsError:
self.queue_client = self.queue_service_client.get_queue_client(queue_name)

# This is the problematic implementation I am trying to replace:
def is_empty(self) -> bool:
return self.queue_client.receive_message(visibility_timeout=0) is None
```

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia individuando l’implementazione di QueueClient e le operazioni esistenti receive_message e queue-metadata. Verifica se i metadati di Azure Queue possono distinguere i messaggi visibili da quelli invisibili, quindi aggiungi test che coprano una coda vuota e una coda con messaggi invisibili; il lavoro è completato quando is_empty() segnala correttamente entrambi i casi.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
azure, python
Ambito
api, backend
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.