En mi aplicación, el estado de un objeto común se cambia al realizar solicitudes y la respuesta depende del estado.
class SomeObj():
def __init__(self, param):
self.param = param
def query(self):
self.param += 1
return self.param
global_obj = SomeObj(0)
@app.route('/')
def home():
flash(global_obj.query())
render_template('index.html')
Si ejecuto esto en mi servidor de desarrollo, espero obtener 1, 2, 3 y así sucesivamente. Si las solicitudes se realizan desde 100 clientes diferentes simultáneamente, ¿puede salir mal algo? El resultado esperado sería que los 100 clientes diferentes vean cada uno un número único del 1 al 100. O ocurrirá algo como esto:
- Consultas del cliente 1.
self.param
se incrementa en 1. - Antes de que se pueda ejecutar la declaración de retorno, el subproceso cambia al cliente 2.
self.param
se incrementa nuevamente. - El hilo vuelve al cliente 1, y al cliente se le devuelve el número 2, digamos.
- Ahora el hilo pasa al cliente 2 y le devuelve el número 3.
Dado que solo había dos clientes, los resultados esperados fueron 1 y 2, no 2 y 3. Se omitió un número.
¿Sucederá esto realmente a medida que amplíe mi aplicación? ¿Qué alternativas a una variable global debería considerar?
fuente