2014-10-01 2 views
0

실행중인 작업의 상태를보기 위해 MSSQL 데이터베이스를 폴링해야합니다. X 초마다 상태 확인을 실행하여 상태가 완료되었는지 확인하고 싶습니다. 스레딩 모듈을 사용하려고합니다. 몇 가지 간단한 print 문을 사용하여 스레딩 모듈을 테스트했는데 작동하는 것처럼 보입니다.하지만 내 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()