zgadzam się, że „w przybliżeniu” nie jest najwyraźniejszy dobór słów, ale jak wspomina Ned próbują zwrócić uwagę, że tylko dlatego, że wielkość kolejki w czasie t1
było 7 nie znaczy, że będzie nadal będzie rozmiar 7, gdy później popchniesz lub pop wartości.
Problem polega na tym, że rozmiar, który otrzymasz z qsize, będzie nadal poprawny, gdy przejdziesz do push/pop, wartość z tej kolejki może nieoczekiwanie zachowywać się w środowisku wielowątkowym.
Na przykład:
q = Queue()
if q.qsize > 0: # size is 1 here
# another thread runs here and gets an item from your queue
# this get fails and throws an exception in your thread:
item = q.get(False)
# do whatever processing with item you need to do
Jest przykładem LBYL „Patrząc przed skokiem” i jest to niebezpieczne ze względu na potencjalne wyścigu tutaj, gdy wiele wątków dostępu do kolejki.
W tym przypadku należy faworyzować EAFP lub „łatwiej jest prosić o przebaczenie niż pozwolenie” i wykonaj następujące czynności:
from Queue import Queue, Empty
import time
q = Queue()
try:
item = q.get(False)
# do whatever processing with item you need to do
except Empty:
time.sleep(1)
Co chwila? Rozmiar kolejki mógł się zmienić podczas powrotu metody. –