用户在使用Python语言开发一个MSSQL定时查询任务时遇到了问题。具体来说,他是想在Python中使用threading
模块来设置一个定时任务,每隔一段时间(比如100秒)就查询一次MSSQL数据库,看看某个任务的状态是否已经完成。如果任务状态已经完成,则停止查询并退出程序。
然而,他在尝试实现这个定时任务时遇到了一个问题:无论他将threading.Timer
设置成什么时间间隔,他都无法让查询任务按照预期的间隔执行。相反,他总是看到'Watching'
语句不断地打印出来,似乎查询任务在不断地执行。
2、解决方案
为了解决这个问题,用户尝试了多种方法,包括使用threading
模块和Twisted
库来设置定时任务。然而,他都没有成功。最后,他找到了一个更简单的方法来实现他的需求。
* 解决方案1:使用time
模块和while
循环 *
他可以使用time
模块和while
循环来设置一个简单的定时任务。代码如下:
import time
import 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 job_watch(server):
with pymssql.connect(server_info) as conn:
with conn.cursor(as_dict=True) as cur:
while True:
watcher_query(cur)
for row in cur:
if is_it_done(row)[1]:
return
time.sleep(100) # Sleep for 100 seconds
job_watch(server_info)
在这个代码中,他使用while True
循环来不断地查询数据库,每次查询的间隔是100秒。如果查询到任务状态已经完成,则退出程序。
* 解决方案2:使用APScheduler
库 *
除了使用time
模块和while
循环之外,用户还可以使用APScheduler
库来设置定时任务。APScheduler
是一个功能强大的定时任务库,可以很容易地创建和管理定时任务。
from apscheduler.schedulers.background import BackgroundScheduler
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 job_watch(server):
with pymssql.connect(server_info) as conn:
with conn.cursor(as_dict=True) as cur:
scheduler = BackgroundScheduler()
scheduler.add_job(watcher_query, 'interval', seconds=100, args=[cur])
scheduler.start()
while True:
for row in cur:
if is_it_done(row)[1]:
scheduler.shutdown()
return
job_watch(server_info)
在这个代码中,他使用APScheduler
库来创建了一个定时任务。这个定时任务每隔100秒就会执行一次watcher_query
函数。如果查询到任务状态已经完成,则停止定时任务并退出程序。