Обратите внимание, что ссылка на очередь сохраняется в глобальной переменной. Благодаря этому очередь может использоваться всеми порожденными потоками выполнения (все они выполняются в одном процессе и в одном глобальном пространстве имен). Потоки изменяют сам объект очереди, а не ссылку в переменной, поэтому они точно так же могли бы работать с очередью, если бы она передавалась, как аргумент функции, выполняемой в потоке. Очередь является совместно используемым объектом в памяти, и неважно, каким способом поток обретет ссылку на него (полную версию сценария, фрагмент которого представлен ниже, вы найдете в файле queuetest2.py, в дереве примеров):
dataQueue = queue.Queue() # общий объект, неограниченный размер
def producer(idnum, dataqueue):
for msgnum in range(nummessages): time.sleep(idnum) dataqueue.put(‘[producer id=%d, count=%d]’ % (idnum, msgnum))
def consumer(idnum, dataqueue): …
if __name__ == ‘__main__’:
for i in range(numproducers):
thread.start_new_thread(producer, (i, dataQueue))
for i in range(numproducers):
thread.start_new_thread(producer, (i, dataQueue))
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011