gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:33 24 4
gpt4 key购买 nike

这是有问题的代码:

  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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com