3

这是有问题的代码:

  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. 我要的是FalseTrue一次,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()

它仍然不起作用,即产生与以前相同的输出。谁能告诉我哪里出错了?

4

2 回答 2

4

分叉创建一个新的进程,所以你不能在原来的进程中修改服务器的变量。请尝试使用 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()
于 2010-10-06T03:49:22.137 回答
2

您的问题是 SocketServer.ForkingMixin 为每个请求创建一个新进程。因此,每次有新请求进入时,所有变量都会重置为默认状态。因此,基本上无论您分配给 self.server.loaded 什么,它都会在下一次请求时重置。这也是全局变量不起作用的原因。

如果您需要一个变量在请求之间保持不变,那么您最好将该数据写入更多的地方,呃,持久=)。从本质上讲,这听起来像是您正在尝试解决保留会话变量的问题。有一百万零一种方法可以做到这一点,根据您的情况,一种方法可能比另一种更相关。我强烈建议看看其他基于 Python 的 SocketServer 应用程序是如何做到的。

只需快速搜索一下与您的代码类似的代码:“filetype:py SocketServer ForkingMixIn”(第一个结果之一是 CherryPy,我强烈建议您查看)。

于 2010-10-06T01:52:42.760 回答