2012-04-16 16 views
13

Các xin chào bản demo thế giới cho Flask là:Làm việc với một singleton toàn cầu trong Flask (WSGI), tôi có phải lo lắng về điều kiện chủng tộc không?

from flask import Flask 
app = Flask(__name__) 

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

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

nếu tôi sửa đổi Điều này như sau:

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() 

Tôi hiểu ứng dụng WSGI có thể có nhiều chủ đề. Chức năng hello có thể chạy trên nhiều luồng cùng một lúc và sau đó chúng tôi sẽ có điều kiện chạy đua. Điều này có đúng không? Nếu mã trên không phải là luồng an toàn, tôi có thể làm gì để làm cho chuỗi đó an toàn?

Tránh globals là một giải pháp có thể, nhưng bạn luôn có thể tránh globals? Nếu tôi muốn một cái gì đó giống như một bộ nhớ cache đối tượng python?

Trả lời

6

Bạn có thể sử dụng một khóa:

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

dụ của bạn (cắt và dán chính xác) trả về một 500 đối với tôi, bởi vì một được tham chiếu trước khi chuyển nhượng. – jeremyjjbrown

+0

Điều này không thực sự trả lời câu hỏi đã nêu. Bạn có _need_ để khóa? Dưới những điều kiện nào? Đây có phải là thông dịch viên duy nhất không có GIL không? – Basic

0

Bạn có thể có một cái nhìn tại g đối tượng mà bạn có thể nhập trực tiếp từ bình, giữ một đối tượng trên toàn cầu cho yêu cầu đó. Nếu bạn đang sử dụng một máy chủ WSGI hướng sự kiện (lốc xoáy, gevent, vv), bạn không nên có bất kỳ vấn đề nào.

+4

Tôi nghĩ rằng đối tượng 'g' chỉ giữ trạng thái trong một yêu cầu, và do đó không hữu ích cho việc sử dụng trên. – osa

2

Bạn có thể thử lớp Địa phương từ werkzeug. Dưới đây là một số thông tin về nó: Context Locals

Ví dụ:

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()