使用Flask运行计划时出现问题

Pas*_*ian 8 python scheduled-tasks task flask

我需要在Flask应用程序上定期运行某个任务.我决定使用一个简单的库 - 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)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我想要'运行定期任务!' 每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
Run Code Online (Sandbox Code Playgroud)

显然,由于某种原因,任务似乎每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
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?运行多个线程时任务排队的方式有问题吗?它仍然没有解释为什么在只有一个任务应该安排的时候安排两个任务.

dir*_*irn 10

当您使用重新加载器运行开发服务器时(默认为debug=True),模块执行两次,导致两个实例t.您可以通过添加来验证这一点print(id(t)).

最简单的方法是传递use_reloader=Falseapp.run.您可以看到此答案,以获得允许您使用重新加载器的替代解决方案.