Warum gibt Pythons Queue in qsize () eine ungefähre Größe zurück?

7

Im Dokument von qsize () steht: Geben Sie die ungefähre Größe der Warteschlange an .

Warum kann es nicht genau die Größe dieser Warteschlange zurückgeben? Ich verstehe, dass auf die Warteschlange von mehreren Threads zugegriffen werden kann, aber im Moment rufe ich die Funktion auf, ich denke, es ist immer noch möglich, die genaue Größe dieses Moments zurückzugeben.

    
FrostNovaZzz 21.07.2012, 11:54
quelle

2 Antworten

24

Es liegt genau daran, dass andere Threads darauf zugreifen. Wenn Sie versuchen, die Größe zu verwenden, die Sie von qsize () erhalten haben, könnte sich die Warteschlange geändert haben. Es wäre besser, wenn die Dokumentation so etwas lesen würde:

  

Gibt die Größe der Warteschlange zurück. Beachten Sie, dass sich die Größe in einer Multithread-Umgebung jederzeit ändern kann. Dies ist nur eine Annäherung an die tatsächliche Größe.

    
Ned Batchelder 21.07.2012, 11:58
quelle
5

Ich stimme zu, dass "approximieren" nicht die klarste Wahl der Wörter ist, aber wie Ned erwähnt, versuchen sie darauf hinzuweisen, dass die Größe der Warteschlange zur Zeit t1 7 nicht bedeutet, dass es immer noch so ist Seien Sie Größe 7, wenn Sie später Werte pushen oder löschen.

Wenn Sie davon ausgehen, dass die Größe, die Sie von qsize zurückbekommen, immer noch korrekt ist, wenn Sie zu push / pop gehen, kann sich ein Wert dieser Warteschlange in einer Umgebung mit mehreren Threads unerwartet ändern.

Zum Beispiel:

%Vor%

Dies ist ein Beispiel für LBYL "Looking before you leap" und es ist gefährlich wegen der möglichen Race Condition hier, wenn mehrere Threads auf die Warteschlange zugreifen.

In diesem Fall solltest du EAFP bevorzugen oder "leichter um Vergebung als um Erlaubnis bitten" und Folgendes tun:

%Vor%     
stderr 21.07.2012 12:33
quelle

Tags und Links