Wie ändere ich Variablen in der Socketserverinstanz innerhalb einer Requesthandler-Instanz in Python?
-
28-09-2019 - |
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?
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)