python - 如何从 Python 中的 RequestHandler 处理程序实例中修改 SocketServer 服务器实例中的变量?

标签 python python-2.7 sockets socketserver

这是有问题的代码:

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

关于python - 如何从 Python 中的 RequestHandler 处理程序实例中修改 SocketServer 服务器实例中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868132/

相关文章:

python多处理: AttributeError: Can't pickle local object

python - “复杂”对象没有属性 '__getitem__'

如果记录满足条件,则 Python 偏移列值与先前记录值

sockets - SOCK_SEQPACKET 可用性?

c - printf保存keepalive定时器

python - 自动为 cython 的 python 变量声明 c 类型

python - 神经网络 : Mysterious ReLu

c# - 配置套接字ACK超时?

python - 什么情况下urllib2会比IE8慢很多?

performance - 使用条件语句加速 Python 嵌套循环