为什么B级不会每1秒打印一次

时间:2017-05-21 13:35:29

标签: python multithreading queue

鉴于以下代码

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()是阻塞函数吗?

1 个答案:

答案 0 :(得分:1)

是的,Queue.get()默认为阻止。来自documentation

  

如果可选的args block 为true且超时None默认),则必要时阻止,直到某个项目为可用。

大胆强调我的。因为q.get()阻塞,所以它不会返回,直到另一个线程在队列中放入一些东西才能获取它。

即便如此,从队列中删除项目意味着下次时不会在那里q.get()不会一次又一次地提取该号码。

相反,如果您使用q.get(False)(或使用q.get_nowait())来阻止阻止,则会引发Empty异常。