服务器上的python脚本中的事件监听器

时间:2015-12-02 16:26:22

标签: python event-listener

我想写一个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()

我的问题是这个代码应该在后台以某种方式运行,还是可以从我的服务器运行它?

1 个答案:

答案 0 :(得分:2)

通常,有两种方法可以检测数据库中的更改(或其他任何地方,实际上):

  • 轮询 - 定期从代码中查询数据库并检测Python代码中的更改。这种方法简单明了,但如果过于频繁地进行轮询,可能确实会对资源造成一点浪费。

  • 通知 - 配置数据库以跟踪更改并通知您的应用程序。这种方法在资源使用方面可能看起来更合理,但实施起来可能会变得非常烦人和混乱,除非你被迫,否则你不想这样做。 在最常见的情况下,这种方法需要您:

    • 决定通知您的应用程序的方式(例如,保持网络套接字打开,收听操作系统信号,跟踪打开的文件或管道等)。
    • 在数据库中实现trigger,它将对行插入或删除作出反应并调用通知过程(例如,执行将向您的服务器发送消息的脚本)。
    • 如果您的应用程序和数据库服务器在不同的计算机上运行,​​您可能需要考虑在其间使用队列,以确保通知中的通知不会丢失。

    或者,如果您的数据库仅从另一个应用程序更改,则可以配置应用程序,以便在发生更改时向您发送通知。如果您的数据库不支持触发器,这可能是您实施基于通知的解决方案的唯一机会(如果有的话)。