ThreadingTcpServer与线程:如何从主线程关闭服务器?
我需要一个可以监听和处理连接的服务器,而 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的原因。