2014-10-01 54 views
0

我需要輪詢MSSQL數據庫來觀察正在運行的作業的狀態。我想每隔X秒運行一次狀態檢查以查看status = done。我正在嘗試使用線程模塊。我用一些簡單的打印語句測試了線程模塊,它似乎可行,但是當我在我的pymssql腳本中嘗試時,它不會。以設定的間隔Python輪詢MSSQL

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

你的代碼編寫方式並不似乎是一個工作順序:

  1. 它不會因爲is_done = false編譯,

  2. 如果固定爲is_done = False,它跳過立即迴路,

  3. 即使循環以某種合理的方式修復,您也永遠不會調用threading.Timer(100, d).start(),並且在您從返回時不檢查任何其他行10檢查使用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()