Flask

2014-11-26 18 views
8

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.

cevap

8

Geliştirme sunucusunu yeniden yükleyiciyle (varsayılan olarak debug=True) çalıştırdığınızda, modül iki kez yürütülür ve bu da iki örneğe t neden olur. Bunu, print(id(t)) ekleyerek doğrulayabilirsiniz.

Bunun etrafındaki en basit yol use_reloader=False ile app.run arasındadır. Yükleyiciyi kullanmanıza olanak sağlayan alternatif bir çözüm için this answer'u görebilirsiniz.