Как Queue работает в python

тестовый код очень прост:

import threading, Queue
import time, random

class Worker(threading.Thread):
    def __init__(self, index, queue):
        threading.Thread.__init__(self)
        self.index = index
        self.queue = queue
    def run(self):
        while 1:
            time.sleep(random.random())
            item = self.queue.get()
            if item is None:
                break
            print "index:", self.index, "task", item, "finished"
            self.queue.task_done()

queue = Queue.Queue(0)
for i in range(2):
    Worker(i, queue).start()
for i in range(10):
    queue.put(i)
for i in range(2):
    queue.put(None)
print "Main OK"

и результат немного отличается каждый раз, когда я его запускаю, вот только один:

Main OK
index: 1 task 0 finished
index: 0 task 1 finished
index: 0 task 2 finished
index: 1 task 3 finished
index: 1 task 4 finished
index: 0 task 5 finished
index: 1 task 6 finished
index: 0 task 7 finished
index: 1 task 8 finished
index: 1 task 9 finished

IMO, когда основной поток завершается, будет напечатано «Main OK», затем первый поток будет выполняться, пока не наступит время .sleep(random.random()), то первый поток будет спать, а второй продолжит работу. то же самое для первого потока, второй поток будет спать при запуске в time.sleep(random.random()), затем первый поток продолжит работу снова. и он напечатает index:0 задача 0 завершенасразу после Main OK, но на самом деле за Main OKследует index: 1... не индекс: 0... ! Зачем? и кажется, что очередь не работает как обычная многопоточность, иногда один и тот же индексный поток будет выполняться три раза или более непрерывно! как работает механизм Queue? любая помощь приветствуется!

5
задан Searene 3 April 2012 в 08:26
поделиться