2014-11-26 2 views
8

플라스크 응용 프로그램에서 정기적으로 특정 작업을 실행해야합니다. 나는 이것을하기 위해 간단한 라이브러리 - Schedule (https://github.com/dbader/schedule)을 사용하기로 결정했다. 주 응용 프로그램 스레드에서 별도의 스레드에서 작업 스케줄러를 실행하고 있습니다. 다음은 관련 코드 스 니펫입니다.플라스크에서 일정을 실행할 때의 문제

import schedule 
import time 

from flask import Flask, request 
from threading import Thread 

app = Flask(__name__) 

start_time = time.time() 

def run_every_10_seconds(): 
    print("Running periodic task!") 
    print "Elapsed time: " + str(time.time() - start_time) 

def run_schedule(): 
    while 1: 
     schedule.run_pending() 
     time.sleep(1) 

@app.route('/', methods=['GET']) 
def index(): 
    return '<html>test</html>' 

if __name__ == '__main__': 
    schedule.every(10).seconds.do(run_every_10_seconds) 
    t = Thread(target=run_schedule) 
    t.start() 
    print "Start time: " + str(start_time) 
    app.run(debug=True, host='0.0.0.0', port=5000) 

이것을 실행하면 '정기적 인 작업 실행'을하고 싶습니다. 매 10 초마다 인쇄합니다. 그러나 이것은 내가 얻는 결과이다.

* Running on http://0.0.0.0:5000/ 
* Restarting with reloader 
Start time: 1417002869.99 
Running periodic task! 
Elapsed time: 10.0128278732 
Running periodic task! 
Elapsed time: 10.0126948357 
Running periodic task! 
Elapsed time: 20.0249710083 
Running periodic task! 
Elapsed time: 20.0247309208 
Running periodic task! 
Elapsed time: 30.0371530056 
Running periodic task! 
Elapsed time: 30.0369319916 

분명히, 어떤 이유로 작업이 한 번이 아니라 10 초마다 두 번 실행되는 것 같습니다. 그러나 단순히 태스크 스케줄러를 Flask와 함께 실행하는 대신 (단순히 app.run() 행을 주석 처리하여) 실행하면 제대로 실행됩니다.

Start time: 1417003801.52 
Running periodic task! 
Elapsed time: 10.0126750469 
Running periodic task! 
Elapsed time: 20.0246500969 
Running periodic task! 
Elapsed time: 30.0366458893 

왜 이런 이유가있을 수 있습니까? 여러 스레드를 실행할 때 작업 대기열에 문제가 있습니까? 아직 두 가지 작업 만 예약해야하는 이유를 설명하지 못합니다.

답변

8

리로더 (기본값 : debug=True)를 사용하여 개발 서버를 실행하면 모듈이 두 번 실행되어 t의 두 인스턴스가 발생합니다. print(id(t))을 추가하여이를 확인할 수 있습니다.

가장 간단한 방법은 use_reloader=Falseapp.run으로 전달하는 것입니다. 리로 더를 사용할 수있는 대체 솔루션은 this answer입니다.

관련 문제