considere el siguiente código en mi aplicación webapp2 en Google App Engine:entendimiento persistencia objeto global en Python WSGI aplicaciones
count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
Con cada actualización de la página, los incrementos de recuento superior.
Vengo del mundo PHP, donde cada solicitud era un nuevo entorno global. Lo que entiendo que está sucediendo aquí es que, debido a que estoy usando la configuración de wsgi para WebApp2, Python no inicia un nuevo proceso en cada solicitud. Si yo estaba usando una configuración de CGI, por el contrario, el medio ambiente mundial sería volver a crear una instancia cada vez, como PHP ...
Asumiendo lo anterior es correcto (si no es así, por favor, corríjanme) ...
- ¿Cómo podría manejar los escenarios donde quisiera una variable global que persistiera solo durante el tiempo de vida de la solicitud? Podría poner una variable de instancia en la clase RequestHandler, pero ¿qué ocurre con los módulos de utilidad que importo que usan variables globales para cosas como almacenar un objeto de mensaje?
- ¿Hay algún tipo de técnica para restablecer todas las variables o forzar una nueva instanciación del entorno?
- ¿El entorno global persiste indefinidamente o se restablece en algún momento?
- ¿Alguno de estos GAE es específico o la persistencia global de wsgi funciona de la misma forma en cualquier escenario de servidor?
EDIT:
He aquí un intento de utilizar ThreadLocal:
count = 0
mydata = threading.local()
mydata.count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
mydata.count = mydata.count + 1
print mydata.count
Estos también incrementan solicitudes a través de
¿Hay algún motivo específico por el que intente almacenar datos globales fuera del almacén de datos? Parece que lo que estás intentando puede lograrse más fácilmente con un [contador detallado] (http://code.google.com/appengine/articles/sharding_counters.html). –
@ Kevin- esa variable de recuento era solo un ejemplo- mi caso real es algo completamente distinto: solo intento comprender el alcance global dentro del dominio de la aplicación. – Yarin
Relacionados [¿Por qué los pilones usan StackedObjectProxies en lugar de threading.local?] (Http://stackoverflow.com/q/1686768/95735) –