2015-12-02 87 views
-1

我想編寫一個python腳本在將檢查數據庫更改(例如記錄總數)的服務器上運行,並且在發生某個操作時它將執行操作。服務器上的python腳本中的事件偵聽器

我是新的python,我不知道我應該如何處理這個問題,有沒有一個建議的事件監聽方法來優化cpu消耗並確保平穩運行?

我不是要求特定的代碼,但更像是高層次的想法。

編輯:KT樂於助人的迴應後,我建立了這個代碼來實現在從URI API JSON響應變化的聽衆:

import json 
import time 
import requests 

class Test(): 

    def __init__(self): 
     self.total_services = self.__get_total_services() 

    def __get_total_services(self): 
     url = "my_url_that_responds_with_json" 
     response = requests.get(url) 
     json_data = response.json() 
     dict_data = json.loads(json.dumps(json_data)) 
     total = len(dict_data['services']) 
     return total 

    def listen_for_changes(self): 
     while 1: 
      if (self.__get_total_services() != self.total_services): 
       self.total_services = self.__get_total_services() 
       """do something""" 
      time.sleep(60) 
     return 0 



my_test = Test() 
my_test.listen_for_changes() 

我的問題是,應在此背景代碼運行不知何故或者可以從我的服務器上像這樣運行它?

回答

2

一般來說,有兩種方法可以檢測數據庫中的變化(或其他地方,其實):

  • 輪詢 - 從你的代碼定期查詢數據庫,並在發現變化的Python代碼。這種方法非常簡單直接,但如果您的調查過於頻繁,對資源確實有點浪費。

  • 通知 - 配置數據庫以跟蹤更改並通知您的應用程序。這種方法在資源使用方面看起來似乎更合理,但它可能會變得如此令人討厭和混亂,以至於除非你被迫去實現,否則你不想這樣去做。 在最一般的情況下,這種做法將要求您:

    • 決定的方式來通知您的應用程序(例如保持網絡套接字打開,聽OS信號,跟蹤打開的文件或管道等) 。
    • 在數據庫中實現一個trigger,該數據庫將對行插入或刪除做出反應並調用通知過程(例如,執行將向您的服務器發送消息的腳本)。
    • 如果您的應用程序和數據庫服務器在不同的機器上運行,您可能需要考慮在中間有一個隊列以確保通知在傳輸過程中不會丟失。

    另外,如果你的數據庫只從一個其他的應用改變了,你可以配置應用每當有新的變化向您發送通知。如果你的數據庫不支持觸發器,這可能是你實現基於通知的解決方案的唯一機會(如果有的話)。

+0

感謝您的回覆,我想我會去投票,通知似乎太複雜了。你是否推薦一個有一些睡眠時間的無限循環來實現這個實現? – welthenwel

+0

固定睡眠時間的無限循環確實是最簡單的事情。 –