Wie ändere ich Variablen in der Socketserverinstanz innerhalb einer Requesthandler-Instanz in Python?

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

Frage

Hier ist der Code in Frage:

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

Jedes Mal, wenn eine neue Anforderung kommt, die Ausgabe ich erhalte, ist False von True gefolgt. Was ich will, ist False von True das erste Mal gefolgt, und True gefolgt von True von nun an.

Warum sind nicht die Modifikationen I auf die Variable in der Serverinstanz gemacht außerhalb des Anwendungsbereichs der handle() Funktion Handler persistierenden?

AKTUALISIERT:

Also, ich versuche mit globalen Variablen zu erreichen, was ich will:

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

Und es immer noch nicht funktioniert, erzeugt das heißt die gleiche Leistung wie zuvor. Könnte jemand bitte sagen Sie mir, wo ich falsch gehe?

War es hilfreich?

Lösung

Forking erstellt einen neuen Prozess, so dass Sie nicht die Server-Variablen im ursprünglichen Prozess ändern können. Versuchen Sie, die ThreadingTCPServer statt:

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

Andere Tipps

Ihr Problem ist, dass SocketServer.ForkingMixin einen neuen Prozess für jede Anforderung erstellt. jedes Mal, wenn eine neue Anforderung kommt in alle Ihre Variablen erhalten zurückgesetzt auf ihren Standardzustand Daher. So im Wesentlichen keine Rolle, was Sie zuweisen self.server.loaded er zurückgesetzt auf die nächste Anforderung erhalten. Dies ist auch, warum Globals wird nicht funktionieren.

Wenn Sie eine Variable müssen zwischen Anforderungen bestehen bleiben würden Sie am besten schreiben, die irgendwo mehr Daten, äh, persistent =). Im Wesentlichen, es klingt wie Sie versuchen, das Problem zu halten Session-Variablen zu lösen. Es gibt eine Million und eine Möglichkeit, es zu tun, und je nach Ihrer Situation, könnte eine Möglichkeit, als eine anderen einschlägig sein. Ich empfehle schauen, wie andere Python-basierte Socket Anwendungen tun es.

Sie doch einfach eine schnelle Google-ähnlichen Code zu Ihnen. „Filetype: py Socket ForkingMixIn“ (eines der ersten Ergebnisse ist CherryPy, die ich zu sehr empfehlen, sich)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top