这是有问题的代码:
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/