threading.timer python的替代方案

时间:2018-03-20 08:27:41

标签: python multithreading timer

我正在尝试实现一个计时器,用于在特定时间后调用打印队列的函数。如果队列在指定时间之前填满并打印队列,我也可以取消计时器。但是之后我的计时器对象突然导致计时器重叠,例如如果队列在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()

2 个答案:

答案 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语句,然后让计时器继续运行直到完成而不影响队列。我不认为它会导致你的程序冲突,因为计时器可能是一个关闭。