Potrzebuję kolejki, w której wiele wątków może umieszczać różne rzeczy, z których wiele wątków może czytać.
Python ma co najmniej dwie klasy kolejek, Queue.Queue i collections.deque, przy czym ta pierwsza najwyraźniej wykorzystuje tę drugą wewnętrznie. Oba twierdzą, że są bezpieczne w wątku w dokumentacji.
Jednak dokumenty kolejki również stwierdzają:
collections.deque to alternatywna implementacja niezwiązanych kolejek z szybkimi atomowymi operacjami append () i popleft (), które nie wymagają blokowania.
Co chyba nie do końca rozumiem: czy to znaczy, że deque nie jest w pełni bezpieczny dla wątków?
Jeśli tak, może nie do końca rozumiem różnicę między dwiema klasami. Widzę, że Kolejka dodaje funkcje blokowania. Z drugiej strony traci niektóre funkcje deque, takie jak wsparcie dla operatora.
Bezpośredni dostęp do wewnętrznego obiektu deque jest
x w Queue (). deque
bezpieczny dla wątków?
Ponadto, dlaczego Queue używa muteksu do swoich operacji, skoro deque jest już bezpieczny dla wątków?
deque
podczas iteracji nawet w tym samym wątku. Jedynym powodem, dla którego nie można uzyskać tego błędu, Queue
jest to, że Queue
nie obsługuje iteracji.
RuntimeError: deque mutated during iteration
to, co możesz uzyskać, to korzystanie ze wspólnegodeque
między kilkoma wątkami i bez blokowania ...