2009-08-19 19 views
6

W klasie queue z modułu Queue, istnieje kilka metod, a mianowicie qsize, empty i full, których dokumentacja twierdzi, że są "niewiarygodne".Python: Dlaczego niektóre metody Queue.queue są "niewiarygodne"?

Co dokładnie nie jest w nich wiarygodne?

Zauważyłem że on the Python docs miejsce następujące mówi się o qsize:

Note, qsize()> 0 nie gwarantuje że późniejsze get() nie będzie blok, ani nie będzie qsize() < maxsize gwarancja, że ​​put() nie będzie blokować.

Osobiście nie uważam tego zachowania za "niewiarygodne". Ale czy to jest to, co rozumie się przez "niewiarygodne", czy też jest jakaś bardziej złowieszcza wada tych metod?

+0

Link do konkretnych docs masz na myśli byłoby miło. –

+3

Dokumentacja jest bezużyteczna. Nie możesz po prostu powiedzieć "ta funkcja jest niewiarygodna" w dokumentacji; musisz dokładnie powiedzieć, co jest niewiarygodne. –

+0

Bez wątpienia http://docs.python.org/library/queue.html. –

Odpowiedz

2

Nie wiem, do którego modułu kolejki się odwołują, proszę podać link?

Jedno z możliwych źródeł zawodności: Ogólnie rzecz biorąc, kolejka jest czytana przez jeden wątek i zapisywana przez inną. Jeśli jesteś jedynym wątkiem uzyskującym dostęp do kolejki, możliwe są niezawodne implementacje qsize(), empty() i full(). Ale gdy zaangażują się inne wątki, wartość zwracana tych metod może być nieaktualna do czasu, kiedy je przetestujesz.

+0

Kolejka.py, część standardowej biblioteki. –

+0

Istnieje moduł Queue.py w standardowej bibliotece Pythona, dodałem komentarze do pytania, aby wskazać jego dokumenty. Źródło znajduje się pod adresem http://svn.python.org/view/python/trunk/Lib/Queue.py?view=markup. –

+0

Ach, ok. Głupio założyłem, że Kolejka nie może być w stdlib, ponieważ nie jest zgodna z konwencjami nazewnictwa PEP8. Sądzę, że to wyjątek. Dzięki za link! – user9876

10

Tak, doktorzy używają tutaj "niewiarygodny", aby przekazać dokładnie to znaczenie: na przykład, w pewnym sensie, qsize nie mówi, ile wpisów jest "teraz", koncepcji, która niekoniecznie jest bardzo znacząca w świecie wielowątkowym (z wyjątkiem określonych punktów, w których podejmowane są środki ostrożności w zakresie synchronizacji) - pokazuje liczbę wpisów, które miał "jakiś czas temu" ... kiedy podążasz za tymi informacjami, nawet w następnym kodzie, kolejka może mieć więcej wpisów, albo mniej, albo wcale, w zależności od tego, co robią inne wątki w międzyczasie (jeśli cokolwiek ;-).

+3

"Nierzetelny" sugeruje dowolną liczbę problemów. Funkcje te powinny być całkowicie niezawodne w niektórych przypadkach użycia (np. Wykrywanie, czy blokada może blokować, z kolejki z jednym wątkiem producenta). "Nierzetelny" jest bez znaczenia. –

+1

@Alex Martelli: W jaki sposób rozmiar zgłaszany przez qsize może nie być teraz wielkością? W końcu wywołujący qsize zatrzymuje muteks, co oznacza, że ​​jest to jedyny wątek, który uzyskuje dostęp do kolejki w tym momencie. Lub używają terminu "teraz", jak "po tym, jak skończyłeś dzwonić qsize"? –

+3

Jest to rozmiar "z powrotem, gdy" wątek wywołujący trzymał muteks - który zostaje zwolniony (w 'końcu') jako część' powrotu'; Jest to wcześniejsza chwila niż chwila, w której kod wywołujący w wątku wywołującym ODBIERA wynik. "W tej chwili" jest momentem, w którym wynik jest powiązany ze zmienną lub używany w jakikolwiek inny sposób: do tego czasu wynik związany lub użyty w inny sposób może już być nieaktualny. –

Powiązane problemy