2012-04-16 15 views
13

बोतल के लिए हैलो दुनिया डेमो है:फ्लास्क (डब्लूएसजीआई) में एक वैश्विक सिंगलटन के साथ काम करना, क्या मुझे दौड़ की स्थिति के बारे में चिंता करने की ज़रूरत है?

from flask import Flask 
app = Flask(__name__) 

@app.route("/") 
def hello(): 
    return "Hello World!" 

if __name__ == "__main__": 
    app.run() 

क्या होगा यदि मैं तो इस तरह संशोधित:

from flask import Flask 
app = Flask(__name__) 

a = 1 
b = 2 
c = 3 

@app.route("/") 
def hello(): 
    a += 1 
    b += a 
    c += b 
    return "Hello World!" 

if __name__ == "__main__": 
    app.run() 

मैं WSGI आवेदन एक से अधिक थ्रेड हो सकता है समझते हैं। hello फ़ंक्शन एक ही समय में एकाधिक धागे पर चल रहा था, और फिर हमारे पास दौड़ की स्थिति होगी। क्या ये सही है? यदि उपरोक्त कोड थ्रेड सुरक्षित नहीं है, तो मैं इसे थ्रेड सुरक्षित बनाने के लिए क्या कर सकता हूं?

ग्लोबल्स से बचने का एक संभावित समाधान है, लेकिन क्या आप हमेशा ग्लोबल्स से बच सकते हैं? अगर मुझे पाइथन ऑब्जेक्ट कैश की तरह कुछ चाहिए तो क्या होगा?

उत्तर

6

आपको एक लॉक इस्तेमाल कर सकते हैं:

from threading import Lock 
from flask import Flask 
app = Flask(__name__) 

a = 1 
b = 2 
c = 3 
lock = Lock() 

@app.route("/") 
def hello(): 
    with lock: 
     a += 1 
     b += a 
     c += b 
    return "Hello World!" 

if __name__ == "__main__": 
    app.run() 
+3

आपका उदाहरण (कटौती और वास्तव में चिपकाया) देता है मेरे लिए एक 500 है, क्योंकि एक काम से पहले संदर्भित है। – jeremyjjbrown

+0

यह वास्तव में निर्दिष्ट प्रश्न का उत्तर नहीं देता है। क्या आप लॉक करने के लिए _need_ है? किस परिस्थितियों में? क्या यह केवल जीआईएल के बिना दुभाषियों के लिए है? – Basic

0

आप g उद्देश्य यह है कि आप कुप्पी से सीधे आयात कर सकते हैं पर एक नज़र हो सकता है कि अनुरोध के लिए विश्व स्तर पर एक वस्तु रहता है। यदि आप एक कार्यक्रम संचालित डब्लूएसजीआई सर्वर (टॉरनाडो, गीवेंट, इत्यादि) का उपयोग कर रहे हैं तो आपको कोई समस्या नहीं होनी चाहिए।

+4

मैंने सोचा था कि 'जी' ऑब्जेक्ट केवल राज्य के अनुरोध के दौरान ही था, और इस प्रकार उपर्युक्त उपयोग के लिए उपयोगी नहीं था। – osa

2

आप स्थानीय वर्ग को werkzeug से आजमा सकते हैं। यहाँ इसके बारे में कुछ जानकारी है: Context Locals

उदाहरण:

from flask import Flask 
from werkzeug.local import Local 
app = Flask(__name__) 
loc = Local() 
loc.a = 1 
loc.b = 2 
loc.c = 3 

@app.route("/") 
def hello(): 
    loc.a += 1 
    loc.b += loc.a 
    loc.c += loc.b 
    return "Hello World!" 

if __name__ == "__main__": 
    app.run() 
संबंधित मुद्दे

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