我有一个类,该类创建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()
的次数与上一堂课的次数完全相同