Замки жестко закодированы в классе Queue. Таким образом, методы put
, get
будут использовать блокировки независимо от того, сколько потоков существует в вашей программе. Очередь - это модуль, используемый для облегчения связи между потоками.
Проверка Queue.py
реализация
class Queue:
def __init__(self, maxsize=0):
...
self.mutex = threading.Lock()
self.not_empty = threading.Condition(self.mutex)
self.not_full = threading.Condition(self.mutex)
self.all_tasks_done = threading.Condition(self.mutex)
self.unfinished_tasks = 0
И его put
метод:
def put(self, item, block=True, timeout=None):
...
self.not_full.acquire()
try:
if self.maxsize > 0:
...
elif timeout is None:
while self._qsize() == self.maxsize:
self.not_full.wait()
self._put(item)
self.unfinished_tasks += 1
self.not_empty.notify()
finally:
self.not_full.release()
Надеюсь, это ответит на ваш вопрос.
UPDATE
Даже метод qsize
использует блокировки:
def qsize(self):
"""Return the approximate size of the queue (not reliable!)."""
self.mutex.acquire()
n = self._qsize()
self.mutex.release()
return n
К вашему сведению, я проверил реализацию Queue.py
для Python2.7