繁体   English   中英

Python按设置的时间间隔轮询MSSQL

[英]Python polling MSSQL at set interval

我需要轮询MSSQL数据库以查看正在运行的作业的状态。 我想每隔X秒运行一次状态检查,以查看状态是否=完成。 我正在尝试使用线程模块。 我已经用一些简单的print语句测试了线程模块,它似乎可以正常工作,但是当我在pymssql脚本中尝试时,它却无法正常工作。

def watcher_query(cursor):
    print 'Watching'
    return cursor.execute(""" select *
                              from some_table' """)
def is_it_done(row):
    if row['status'] == 'done':
        return row['the_id'], True
    else:
        return row['the_id'], False

def d(cur):
    watcher_query(cur)
    for row in cur:
        return is_it_done(row)[1]
    threading.Timer(100, d).start()

def job_watch(server):
    with pymssql.connect(server_info) as conn:
        with conn.cursor(as_dict=True) as cur:
            is_done = false
            while is_done:
                is_done = d(cur)

无论我如何设置threading.Timer ,我都会看到“ Watching”语句不断打印。 是否有更好的方法来设置轮询计时器?

我还尝试使用Twisted设置一个基本函数,该函数每隔X秒调用一次函数,直到满足某些条件为止。 我还没有尝试使用MSSQL。

您的代码编写方式似乎工作不正常:

  1. 由于is_done = false ,因此无法编译

  2. 如果固定为is_done = False ,它将立即跳过循环,

  3. 即使以某种合理的方式修复了循环,您也永远不会调用threading.Timer(100, d).start()并且在使用return is_it_done(row)[1]检查了第一行之后从d返回时不会检查任何其他行return is_it_done(row)[1]

实际的定时工作程序方法执行什么操作,打印到控制台或检查数据库都无关紧要,并且在相同的计时器下应该工作相同。

像这样的事情呢:

import threading


def is_it_done():
    # get some dummy predictable results
    if not hasattr(is_it_done, 'results'):
        is_it_done.results = iter([False] * 3)
    return next(is_it_done.results, True)


def job_watch():
    is_done = False

    def d():
        is_done = is_it_done()
        print('is_done: {}'.format(is_done))
        timer = threading.Timer(3, d).start()

    d()


job_watch()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM