Python以设定的间隔轮询MSSQL

时间:2014-10-01 00:54:03

标签: python timer pymssql

我需要轮询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设置为什么,我都会看到'观看'声明打印不断。是否有更好的方法来设置轮询计时器?

我还尝试使用Twisted来设置一个基本功能,每隔X秒进行一次函数调用,直到满足某些条件。尽管如此,我还没有尝试使用MSSQL。

1 个答案:

答案 0 :(得分:0)

您编写代码的方式似乎并未处于正常工作状态:

  1. 由于is_done = false

  2. ,它无法编译
  3. 如果修复为is_done = False,则会立即跳过循环,

  4. 即使循环以某种合理的方式得到修复,您仍然无法调用threading.Timer(100, d).start()并且在检查完之后立即从d返回时检查任何其他行第一行使用return is_it_done(row)[1]

  5. 实际的定时工作者方法所做的事情,打印到控制台或检查数据库并不重要,应该使用相同的计时器。

    这样的事情:

    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()