2014-11-26 13 views
8

के साथ शेड्यूल चलाने पर समस्या मुझे अपने फ्लास्क एप्लिकेशन पर समय-समय पर एक निश्चित कार्य चलाने की आवश्यकता है। मैंने ऐसा करने के लिए एक साधारण पुस्तकालय - अनुसूची (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 सेकंड में दो बार निष्पादित होता प्रतीत होता है। हालांकि, अगर मैं केवल फ्लास्क के साथ इसे चलाने के बजाय अकेले कार्य शेड्यूलर चलाता हूं (केवल 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=False से app.run पास करना है। आप वैकल्पिक समाधान के लिए this answer देख सकते हैं जो आपको पुनः लोडर का उपयोग करने की अनुमति देता है।