ThreadingTcpServer与线程:如何从主线程关闭服务器?

0 投票
1 回答
584 浏览
提问于 2025-04-17 22:25

我需要一个可以监听和处理连接的服务器,而 ThreadingTcpServer 可以帮我完成这个工作,所以我决定使用它。

我注意到 ThreadingTcpServer.serve_forever() 是一个阻塞的方法,这意味着它会一直运行,直到被强制停止。所以我想把线程服务器本身也放在一个线程里。

我的代码是:

server = None #a variable that will contain the server

def createAndStartServer():
  print "starting..."
  server = ThreadingTcpServer((socket.gethostname(),1234),MyRequestHandler)
  server.serve_forever() #blocking method
  print "stopping..."

myThread = threading.Thread(target=createAndStartServer)
myThread.start()
time.sleep(3)
server.shutdown() #this one should stop the server thread from receiving further requests

我的想法是给服务器发送一个关闭的信号,这样线程最多只会处理它正在处理的请求,然后退出 serve_forever() 的循环。这样一来,线程就会停止,因为它会退出 createAndStartServer 函数。我不知道这样做是否是最好的方法,但我觉得这样很合理。在 Java 中,我经常通过修改一个布尔变量的值来控制线程服务器的循环……我觉得关闭方法也做了类似的事情,对吧?

不过,我遇到了一个错误:

AttributeError: 'NoneType' object has no attribute 'shutdown'

看起来服务器变量根本没有被线程填充。为什么会这样?顺便问一下,我的逻辑是否正确,或者你有没有更好的办法来解决我的问题。

1 个回答

0

你在createAndStartServer()这个函数里缺少一个“全局服务器”。

默认情况下,Python会把server = Threading()当作一个新的变量,这个变量的作用范围是局部的。这就是为什么在主程序中调用它时会失败,并且返回None的原因。

撰写回答