Как изменить переменные в экземпляре SocketServer Server из экземпляра обработчика RequestHandler в Python?

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

Вопрос

Вот код под вопросом:

  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, который я настоятельно рекомендую смотреть на).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top