2012-04-16 1 views
13

플라스크에 대한 안녕하세요 세계 데모입니다 : 내가 지금처럼이를 수정하면 어떻게Flask (WSGI)에서 글로벌 싱글 톤으로 작업 할 때 경쟁 조건에 대해 걱정해야합니까?

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 함수는 동시에 여러 스레드에서 실행될 수 있으며 경쟁 조건이 있습니다. 이 올바른지? 위 코드가 스레드 안전하지 않은 경우 스레드 안전을 위해 무엇을 할 수 있습니까?

전역을 피하는 것이 가능한 해결책이지만 항상 전역을 피할 수 있습니까? 파이썬 객체 캐시와 같은 것을 원한다면?

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

답변

6

당신은 잠금을 사용할 수 있습니다. 이벤트 중심의 WSGI 서버 (토네이도, gevent 등)를 사용하고 있다면 문제가 없어야합니다.

+3

귀하의 예 (절단 정확히 붙여 넣기), 슈팅을 할당하기 전에 참조하기 때문에, 나를 위해 500을 반환합니다. – jeremyjjbrown

+0

이것은 실제로 명시된 질문에 대답하지 않습니다. 잠그고 잠글까요? 어떤 조건에서? 이것은 GIL이없는 통역사만을위한 것입니까? – Basic

0

당신은, 당신은 플라스크에서 직접 가져올 수 있습니다 g 객체를 살펴 해당 요청에 대해 전역 객체를 유지 있습니다

+4

나는'g' 객체가 요청 중에 만 상태를 유지하고 있다고 생각했기 때문에 위의 경우에 유용하지 않았습니다. – 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() 
관련 문제