¿Cómo se modifican las variables en la instancia del servidor SocketServer desde dentro de una instancia de manejador RequestHandler en Python?

StackOverflow https://stackoverflow.com/questions/3868132

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?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top