2016-11-24 46 views
1

我已经看遍了堆栈溢出,我还没有看到一个问题,直接关系到我想要做什么。
我目前正在尝试编写一个服务器,该服务器在每个查询上生成一个线程,然后在查询完成后放弃该线程。我一直在阅读尽可能多的线程问题,但我发现的唯一答案是提示关闭套接字服务器,我认为这对我而言并不合适。这个例子只有一个线程,但想象一下它们有n个。它们会在查询时产生,因为它们在server_forever上,所以它们基本上是内存泄漏。我是相当新的Python穿线,我我试着初始化线程没有serve_forever,但我得到以下几点:如何停止一个套接字serve_forever线程蟒蛇2.7

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

为什么打电话给'shutdown'是不可接受的?这只影响每个SocketServer实例。 – Goodies

+0

让我试试看,我会尽快回复您。根据我的理解,我认为除了现有的连接之外,它完全关闭了套接字。值得一试。 –

+0

为什么你会为传入连接产生一个新的套接字服务器?我有点困惑。 – Goodies

回答

0

检查代码学习线程我已经认识到,直到守护进程被终止插座保持开放的属性之后。我在这里列出的问题已经在处理,因为线程已被守护进程并可以被程序终止。如果线程没有被守护进程,那么它将不会被终止,并且实际上将serve_forever。 Server_shutdown用于在线程停止后帮助清理。