2017-07-04 54 views
1

我正在使用RabbitMQ和Python從RabbitMQ服務器中檢索郵件。如果超過5分鐘,我希望程序執行某些操作,並且沒有收到來自Rabbitmq的消息。確定功能中的已用時間?

我在RabbitMQ網站上找到了示例python代碼,它運行並打印收到的每條消息。我試圖弄清楚如何添加計時器,以便在收到消息後超過5分鐘時間的情況下執行XYZ。

有關如何完成此任何想法?下面是從RabbitMQ的代碼:

#!/usr/bin/env python 
import pika 
import time 

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) 
channel = connection.channel() 

def callback(ch, method, properties, body): 
    print(" [x] Received %r" % body)  # Print out received message 

channel.basic_consume(callback, 
         queue='SlackWebhook', 
         no_ack=True) 

print(' [*] Waiting for messages. To exit press CTRL+C') 
channel.start_consuming() 
+1

我不知道RabbitMQ,但查看你的代碼「BlockingConnection」我的推薦是看看NonBlockingConnection,因爲如果他們把阻塞在函數名稱中,它們必須有一個非阻塞的。然後檢查你打給消費者的時間。 – Mquinteiro

+1

使用上下文管理器執行此操作的一種簡單方法顯示在文章[** _使用Python定時您的代碼「中使用」Statement _ **「(http://preshing.com/20110924/timing-your-code-using-蟒蛇,用語句/)。只需將'channel.start_consuming()'行放入'Timer():'中即可。 – martineau

回答

0

您可以創建在你的程序實例化一次一個Singleton對象。在這個對象內部,你可以創建一個計時器。您啓動計時器並保持運行狀態,並且每次從RabbitMQ收到一些消息時將其重置爲零。在那個Singleton裏面,你需要有一個while True循環來檢查定時器,並且如果時間超過5分鐘就觸發一些動作。

基本思想是讓定時器運行,每次從RabbitMQ收到時將其設置爲零,並讓觀察者檢查該定時器是否已經過了多長時間。該實現可以通過Singleton或其他任何可以在整個程序中持續存在的數據結構來實現。如果您有多個線程或進程,使用持久數據庫或內置線程安全的Python數據結構會更容易。

希望這有助於。