鉴于以下代码
from threading import Thread
import Queue
from time import sleep
class myClassA(Thread):
def __init__(self,num,q):
Thread.__init__(self)
self.daemon = True
self.num = num
self.start()
def run(self):
while True:
self.num = self.num+1
q.put(self.num)
sleep(5)
class myClassB(Thread):
def __init__(self,num,q):
Thread.__init__(self)
self.daemon = True
self.num = num
self.start()
def run(self):
while True:
self.num = q.get()
print self.num
sleep(1)
num = 0
q = Queue.Queue()
myClassA(num,q)
myClassB(num,q)
while True:
pass
为什么B级每秒都不打印?我希望B级打印5个1然后打5个等等。q.get()
是阻塞函数吗?
答案 0 :(得分:1)
是的,Queue.get()
默认为阻止。来自documentation:
如果可选的args block 为true且超时为
None
(默认),则必要时阻止,直到某个项目为可用。
大胆强调我的。因为q.get()
阻塞,所以它不会返回,直到另一个线程在队列中放入一些东西才能获取它。
即便如此,从队列中删除项目意味着下次时不会在那里。 q.get()
不会一次又一次地提取该号码。
相反,如果您使用q.get(False)
(或使用q.get_nowait()
)来阻止阻止,则会引发Empty
异常。