我的程序需要一个监听和处理连接的服务器,因为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中,我经常做同样的,通过修改处理线程服务器循环的布尔变量的值…shutdown方法应该是这样的,对吧?
无论如何我得到了一个:
AttributeError: 'NoneType'对象没有属性'shutdown'
似乎服务器变量根本没有被线程填充。为什么?同时告诉我我的逻辑是否正确,或者你有更好的主意来处理我的问题。
您的createAndStartServer()中缺少一个"全局服务器"。
默认情况下,python会将server = Threading()视为具有局部作用域的新变量。这就解释了为什么在使用None值之后从main调用它会失败。