簡體   English   中英

替代threading.timer python

[英]Alternative for threading.timer python

我正在嘗試實現一個計時器,以在特定時間后調用用於打印隊列的函數。如果在指定時間之前隊列已滿,我也可以取消計時器並打印隊列。但是在那之后,我的計時器對象的行為突然導致計時器重疊,例如,如果隊列在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()

我已通過取消計時器來防止重復操作來解決此問題

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()

您可以在計時器內嵌套一條if語句,該語句說如果隊列已滿,則禁用此if語句,然后讓計時器繼續運行直至完成,而不會影響隊列。 我認為這不會與您的程序產生沖突,因為計時器可能是關閉的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM