使用线程时,循环在最后的迭代中挂起

时间:2019-03-11 09:55:08

标签: python-3.x queue python-multithreading

我有一个类,该类创建Thread对象以在循环中生成一些项并将它们存储在Queue中,伪代码如下所示:

class DetectionProcessor:
    def __init__(self, detectionloader, queueSize = 1024):
        'some initializer code'
        self.Q = Queue(maxsize = queueSize)

    def start(self):
        t = Thread(target=self.update, args=())
        t.daemon = True
        t.start() 

    def update(self):
        for i in range(self.datalen):
             item = 'code to generate item'
             while self.Q.full():
                 time.sleep(0.2)
             self.Q.put(item)
    def read(self):
        return self.Q.get()

    def len(self):
        return self.Q.qsize()

在主程序中,我还使用.get()循环访问项

det_processor = DetectionProcessor(loader).start()
for i in im_names_desc:

        with torch.no_grad():
             item = det_processor.read()

似乎发生的事情是主循环det_processor.read()的最后几次迭代挂起,将不再继续进行。中断运行时后,我得到以下回溯:

更新:

我忘了提到DetectionProcessor类不是唯一使用多线程和Queue类的类,而是最后一个类。在摆弄了一些代码之后,我意识到实际上挂起的原因是因为它正在另一个队列中调用get(),该队列在最后几次迭代中是空的。这不应该发生,因为我打电话给get()的次数与上一堂课的次数完全相同

0 个答案:

没有答案