我在堆栈溢出时到处查看,我没有看到与我尝试做的事情直接相关的问题。
我目前正在尝试编写一个服务器,在每个查询上生成一个线程,然后在查询完成后丢弃该线程。我一直在阅读尽可能多的线程问题,但我发现的唯一答案是建议关闭套接字服务器,我认为套接字服务器在我的情况下不起作用。这个例子只有一个线程,但想象一下它们有n个。它们将在查询时生成,因为它们位于server_forever上,它们基本上是内存泄漏。我在Python中使用线程相当新,我尝试在没有serve_forever的情况下初始化线程,但我得到以下内容:
AttributeError: ThreadingUDPServer instance has no __call__ method
如何在保持目标调用的同时停止serve_forever线程或如何在不使用serve_forever的情况下实例化线程?我已经阅读了Python指南中有关线程的大部分文档,但它们似乎都没有解决线程上的serve_forever函数问题。
myController = Controller.Controller()
servers = [SocketServer.ThreadingUDPServer(('', 53), myController.UDPRequestHandler),]
thread = threading.Thread(target=servers[0].serve_forever)
thread.daemon = True
thread.start()
print 'UDP server loop running in thread: %s' % (thread.name)
try:
while 1:
time.sleep(1)
sys.stderr.flush()
sys.stdout.flush()
答案 0 :(得分:0)
在查看代码并研究线程属性之后,我逐渐意识到套接字一直处于打开状态,直到守护程序终止。我在此处列出的问题已经在处理,因为线程已被守护,并且可以由程序终止。如果线程没有被守护,那么它将不会被终止并且实际上将是serve_forever。 Server_shutdown可以帮助在线程停止后进行清理。