【问题标题】:Python: Polling a SQL database every n seconds and executing a task based on itPython:每 n 秒轮询一次 SQL 数据库并基于它执行任务
【发布时间】:2016-07-11 04:18:33
【问题描述】:

我想制作一个每 n 秒 (n>10) 轮询一次 SQL 数据库的程序。它验证特定列中的数据并基于它调用函数。

例如,

when column has '1' -> call function1  
when column has '2' -> call function2  
when column has '3' -> exits 

我研究了多线程并看到了一个基于 threading.timer 的解决方案,这能满足我的用例吗?
此外,我会接受高达 +/-1 秒的时间漂移​​。

【问题讨论】:

    标签: python sql-server multithreading scheduling


    【解决方案1】:

    根据查询的复杂性和调用的函数,您可能不需要多个线程。如果您的查询运行速度很快并且您的函数调用很便宜,那么只需使用最简单的解决方案来完成这项工作,即执行轮询的循环,调用您的函数,然后在剩余的时间内休眠。
    如果你想每 10 秒调用一次,而你的查询用了 1 秒,函数调用用了 1 秒,那么休眠 8 秒,这样你的时间漂移​​就不会随着时间的推移而增加。

    【讨论】:

    • 我猜,这是一种可行的解决方案。但我认为我无法计算时间复杂度将如何随着数据库规模的增长而增长。此外,数据库位于服务器上,因此多个进程可能在任何给定时间轮询它,因此查询时间可能不一致。此外,多线程可以让我在线程运行时做其他事情,不是吗?
    • 如果您知道数据库的大小会增长,并且每隔几秒执行一次相同的查询,那么您最好使用索引优化它并保持恒定时间以隐藏并发问题。此外,10 秒在我们的业务中是相当长的时间,因此对于运行查询来说应该绰绰有余。是的,它允许你做其他事情,但是如果这些事情在 10 秒后仍未完成,会发生什么 - 再次产生一个新线程,然后再次产生直到机器资源不足?当然你可以使用多个线程,但我只会在必要时这样做,因为它会增加复杂性
    • 那么,如果我遵循您的解决方案(即没有线程),有没有办法可以在后台执行其他不处理数据库的任务?
    • 不,基于您的问题“我想制作一个轮询 SQL 数据库的程序......”我认为您的程序的工作是轮询数据库并根据查询结果执行函数为此,我不会使用线程,因为它没有必要。但是,如果该轮询嵌入到另一个程序中,或者您的“新”程序也应该执行其他操作,那么请使用 threading.timer。它在 IT 中一如既往 - “这取决于”:)
    • 啊,谢谢。实际上,我需要同时执行这两项操作,某些功能将根据查询结果执行,而其他功能则根本不与 DB 交互。那我就用threading.timer。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多