2017-03-08 5 views
5

जब मैं अपने फ्लास्क ऐप में किसी पृष्ठ तक पहुंचता हूं तो मैं काउंटर को बढ़ाना चाहता हूं। यदि दो उपयोगकर्ता पृष्ठ तक पहुंचते हैं, तो गिनती 2 से बढ़नी चाहिए। मैंने निम्नलिखित की कोशिश की लेकिन गिनती हमेशा होती है 1. मैं प्रत्येक एक्सेस के लिए मूल्य कैसे बढ़ा सकता हूं?फ्लास्क व्यू के प्रत्येक एक्सेस के लिए वृद्धि काउंटर

@app.route('/count') 
def make_count(): 
    count = 0 
    value = count + 1 
    return jsonify(count=value) 

उत्तर

7

समवर्ती गणना करना मुश्किल है। मान लें कि गिनती 0 है। यदि दो उपयोगकर्ता दोनों अंतराल पर अंतराल पर अंतराल पर आते हैं, तो वे प्रत्येक को मान 0 प्राप्त कर सकते हैं, इसे 1 तक बढ़ा सकते हैं, और इसे वापस रख सकते हैं। दो उपयोगकर्ताओं ने एंडपॉइंट मारा, लेकिन परिणामी गिनती 1, 2 नहीं है। इसके आस-पास पहुंचने के लिए, आपको डेटा स्टोर का उपयोग करने की आवश्यकता है जो परमाणु रूप से वृद्धि का समर्थन करता है (जैसा कि एक ऑपरेशन है कि केवल एक ही प्रक्रिया एक समय में कर सकती है)।

आप एक साधारण पायथन global का उपयोग नहीं कर सकते क्योंकि डब्लूएसजीआई सर्वर कई प्रक्रियाओं को जन्म देगा, इसलिए उनमें से प्रत्येक के पास वैश्विक की अपनी स्वतंत्र प्रति होगी। दोहराए गए अनुरोधों को विभिन्न प्रक्रियाओं द्वारा नियंत्रित किया जा सकता है, जिसके परिणामस्वरूप अलग-अलग, असंक्रमित मान होते हैं।

सबसे सरल समाधान एक पायथन multiprocessing.Value है। यह प्रक्रियाओं के दौरान साझा मूल्य तक पहुंच को सिंक्रनाइज़ करता है, जब तक कि मूल्य बनने के बाद प्रक्रियाएं उत्पन्न होती हैं।

from flask import Flask, jsonify 
from multiprocessing import Value 

counter = Value('i', 0) 
app = Flask(__name__) 

@app.route('/') 
def index(): 
    with counter.get_lock(): 
     counter.value += 1 

    return jsonify(count=counter.value) 

app.run(processes=8) 
# access http://localhost:5000/ multiple times quickly, the count will be correct 

अभी भी कुछ चेतावनियां हैं:

  • डेटा केवल जब तक प्रबंधक जिंदा है बनी हुई है। यदि आप सर्वर को पुनरारंभ करते हैं, काउंटर भी रीसेट करता है।
  • यदि एप्लिकेशन प्रक्रियाओं को एकाधिक मशीनों में वितरित किया जाता है, तो साझा स्मृति को ग्लोबल्स के समान समस्याएं होती हैं: वे केवल स्थानीय मशीन पर सिंक्रनाइज़ होते हैं, नेटवर्क पर नहीं।

असली दुनिया परिदृश्यों के लिए, Redis एक बहुत अधिक मजबूत समाधान है। सर्वर वेब अनुप्रयोग से स्वतंत्र है, दृढ़ता के लिए विकल्प हैं, और परमाणु वृद्धि कर सकते हैं। इसका उपयोग कैशिंग जैसे अनुप्रयोग के अन्य हिस्सों के लिए भी किया जा सकता है।

संबंधित मुद्दे