我需要轮询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。
答案 0 :(得分:0)
您编写代码的方式似乎并未处于正常工作状态:
由于is_done = false
,
如果修复为is_done = False
,则会立即跳过循环,
即使循环以某种合理的方式得到修复,您仍然无法调用threading.Timer(100, d).start()
并且在检查完之后立即从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()