我正在尝试实现一个计时器,用于在特定时间后调用打印队列的函数。如果队列在指定时间之前填满并打印队列,我也可以取消计时器。但是之后我的计时器对象突然导致计时器重叠,例如如果队列在2秒内被填满,那么它以2,8,2,8 ...时间间隔而不是2,10时间间隔打印队列
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1'))
channel = connection.channel()
channel.queue_declare(queue='final', durable=True)
global msg_queue
global t
msg_queue=queue.Queue(maxsize=6)
def empty_queue():
print(time.time())
l=[]
i=int(msg_queue.qsize())
while i!=0:
l.append(msg_queue.get())
i-=1
t=threading.Timer(10,empty_queue)
print(l)
t.start()
t=threading.Timer(10,empty_queue)
print(time.time())
t.start()
while True:
if int(msg_queue.qsize())<6:
consume_generator = channel.consume(queue='final', no_ack=True)
result=next(consume_generator)
msg_queue.put(json.loads(result[2].decode("utf-8")))
else:
print("more",time.time())
t.cancel()
empty_queue()
答案 0 :(得分:0)
我已经通过取消计时器来解决问题,以防止其自身重复
def empty_queue():
global t
print(time.time())
l=[]
i=int(msg_queue.qsize())
while i!=0:
l.append(msg_queue.get())
i-=1
if t.isAlive():
t.cancel()
t=threading.Timer(10,empty_queue)
print(l)
t.start()
答案 1 :(得分:-1)
您可以在计时器中嵌入if语句,该语句表示如果队列已满,则禁用此if语句,然后让计时器继续运行直到完成而不影响队列。我不认为它会导致你的程序冲突,因为计时器可能是一个关闭。