ile program çalıştırırken sorun Flask uygulamamda belirli bir işi belirli aralıklarla çalıştırmam gerekiyor. Bunu yapmak için basit bir kütüphane - Schedule (https://github.com/dbader/schedule) kullanmaya karar verdim. Görev zamanlayıcıyı ana uygulama iş parçacığından ayrı bir iş parçacığı üzerinde çalıştırıyorum. İşte ilgili kod snippet'i.Flask
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)
Bunu çalıştırdığımda, 'Periyodik görev çalıştırmayı istiyorum!' her 10 saniyede bir yazdırmak için. Ancak, bu aldığım çıktı.
* 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
Açıkçası, bazı nedenlerden dolayı, görev kez yerine iki kez her 10 saniyede yürütme gibi görünüyor. Ancak, sadece Flask (sadece app.run() satırını yorumlayarak) ile çalıştırmak yerine sadece görev zamanlayıcısı çalıştırırsam düzgün çalışır.
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
Bunun arkasındaki sebep ne olabilir? Birden çok iş parçacığı çalıştırırken görevlerin sıraya alınmasında bir sorun var mı? Yine de, sadece birinin olması gereken zamanda iki görevin neden planlandığını açıklamıyor.