Как изменить переменные в экземпляре SocketServer Server из экземпляра обработчика RequestHandler в Python?
-
28-09-2019 - |
Вопрос
Вот код под вопросом:
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()
Каждый раз, когда новый запрос приходит, вывод, который я получаю, это False
с последующим True
. Отказ Что я хочу, это False
с последующим True
первый раз и True
с последующим True
Отныне.
Почему модификации не сделали в переменной в экземпляре сервера, не сохраняются за пределами объема обработчика handle()
функция?
Обновлено:
Итак, я пытаюсь использовать глобальные переменные для достижения того, что я хочу:
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()
И это все еще не работает, то есть производит тот же выход, что и раньше. Может кто-нибудь, пожалуйста, скажи мне, куда я иду не так?
Решение
Forking создает новый процесс, поэтому вы не можете изменять переменные сервера в исходном процессе. Попробуйте ThreadingTCPServer вместо этого:
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()
Другие советы
Ваша проблема заключается в том, что socketserver.forkingmixin создает новый процесс для каждого запроса. Поэтому каждый раз, когда новый запрос происходит во всех ваших переменных, получается сброс в их состояние по умолчанию. Таким образом, по сути, независимо от того, что вы назначаете Self.server.loaded, он будет сброшен по следующему запросу. Это также почему глобалы не будут работать.
Если вам нужна переменная, чтобы сохраниться между запросами, вы больше всего напишу, что данные где-то больше, er, pursistent =). По сути, звучит так, как вы пытаетесь решить проблему сохранения переменных сеансов. Есть миллион и один способ сделать это и в зависимости от вашей ситуации, в одну сторону может быть более уместным, чем другой. Я настоятельно рекомендую посмотреть, как это делают другие приложения Socketerver на базе Python.
Просто сделайте быстрый Google для подобного кода к вашему: «FileType: PY Socketserver Forkingmixin» (один из первых результатов - Cherrypy, который я настоятельно рекомендую смотреть на).