¿Cómo se modifican las variables en la instancia del servidor SocketServer desde dentro de una instancia de manejador RequestHandler en Python?
-
28-09-2019 - |
Pregunta
Este es el código en cuestión:
class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
__slots__ = ("loaded")
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
print self.server.loaded # Prints "False" at every call, why?
self.server.loaded = True
print self.server.loaded # Prints "True" at every call, obvious!
server = Server(('localhost', port), Handler)
server.loaded = False
while True:
server.handle_request()
Cada vez que una nueva petición llega, la salida que se ve es False
seguido por True
. Lo que quiero es False
seguido por True
la primera vez, y True
seguido por True
adelante.
¿Por qué no son las modificaciones que hice a la variable en la instancia del servidor que persiste fuera del ámbito de la función handle()
del guía?
ACTUALIZADO:
Por lo tanto, trato de utilizar variables globales para lograr lo que quiero:
loaded = False
class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
pass
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
global loaded
print loaded # Prints "False" at every call still, why?
loaded = True
print loaded # Prints "True" at every call, obvious!
def main():
server = Server(('localhost', 4444), Handler)
global loaded
loaded = False
while True:
server.handle_request()
if (__name__ == '__main__'):
main()
Y aún así no funciona, es decir, produce el mismo resultado que antes. ¿Podría alguien por favor dígame dónde voy mal?
Solución
El bifurcar crea un nuevo proceso, por lo que no puede modificar las variables del servidor en el proceso original. Prueba el ThreadingTCPServer lugar:
import SocketServer
class Server(SocketServer.ThreadingTCPServer):
__slots__ = ("loaded")
class Handler(SocketServer.StreamRequestHandler):
def handle(self):
self.server.loaded = not self.server.loaded
print self.server.loaded # Alternates value at each new request now.
server = Server(('localhost',5000),Handler)
server.loaded = False
while True:
server.handle_request()
Otros consejos
Su problema es que SocketServer.ForkingMixin crea un nuevo proceso para cada solicitud. Por lo tanto, cada vez que una nueva petición se produce en todas sus variables reconfiguradas a su estado predeterminado. Así que, esencialmente, no importa lo que se asigna a self.server.loaded obtendrá reinicio en la próxima petición. Esta es también la razón por variables globales no funcionará.
Si necesita una variable para persistir entre las solicitudes será mejor que escribir datos en un sitio más, er, = persistentes). En esencia, parece que usted está tratando de resolver el problema de mantener las variables de sesión. Hay un millón y una maneras de hacerlo, y dependiendo de su situación, de una forma podría ser más pertinente que otro. Yo recomiendo mirar cómo otras aplicaciones SocketServer basado en Python lo hacen.
Sólo hacer una rápida de Google para el código similar a la suya:. "Filetype: py SocketServer ForkingMixIn" (uno de los primeros resultados es CherryPy que recomiendo mirar)