测试代码非常简单:
每次运行结果都有些不同,这里只是其中一个例子:
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
当主线程终止时,将打印“Main OK”,然后第一个线程将被执行,直到进入time.sleep(random.random())
,然后第一个线程将休眠,第二个线程将继续执行。与第一个线程相同,第二个线程在运行到time.sleep(random.random())
时也会休眠,然后第一个线程将再次继续。它将在Main OK
之后立即打印index:0 task 0 finished
,但实际上跟随Main OK
的是index: 1...
而不是index: 0...
!为什么?并且似乎队列机制没有像正常的多线程一样运行,有时相同索引的线程将连续执行三次或更多次!队列机制是如何工作的?任何帮助都将不胜感激!