使用ThreadingMixin停止BaseHTTPServer生成的线程

IT *_*nja 5 python multithreading basehttpserver python-2.7

我在这篇文章中已经阅读过使用ThreadingMixin(从SocketServer模块中),您可以创建一个带线程的服务器BaseHTTPServer.我试过了,它确实有效.但是,如何停止服务器生成的活动线程(例如,在服务器关闭期间)?这可能吗?

aba*_*ert 8

最简单的解决方案就是使用daemon_threads.简短的版本是:只需将其设置为True,不要担心; 当您退出时,任何仍在工作的线程都将自动停止.

正如ThreadingMixIn文档所说:

从ThreadingMixIn继承线程连接行为时,应明确声明线程在突然关闭时的行为方式.ThreadingMixIn类定义了一个属性daemon_threads,它指示服务器是否应该等待线程终止.如果您希望线程自动运行,则应该显式设置标志; 默认值为False,这意味着在ThreadingMixIn创建的所有线程都退出之前,Python不会退出.

更多详细信息可在threading文档中找到:

线程可以标记为"守护程序线程".这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出.初始值继承自创建线程.可以通过守护程序属性设置该标志.

有时候这是不合适的,因为你想在不退出的情况下关闭,或者因为你的处理程序可能需要进行清理.但是,当它适当的,你不能得到任何简单.

如果你需要的只是一种在不退出的情况下关闭的方法,并且不需要保证清理,你可以通过ctypes或使用特定于平台的线程消除API win32api.这通常是一个坏主意,但偶尔这是你想要的.

如果您需要干净关闭,则需要为线程配合构建自己的机器.例如,您可以创建一个受a保护的全局"退出标志"变量threading.Condition,并让您的handle函数定期检查它.

如果线程正在执行缓慢,无阻塞的工作,您可以分解成更小的部分,这是非常好的.例如,如果handle函数始终每5秒至少检查一次退出标志,则可以保证能够在5秒内关闭线程.但是如果线程正在进行阻塞工作 - 就像它们可能的那样,因为你使用的全部原因ThreadingMixIn是让你进行阻塞调用而不是编写select循环或使用asyncore等等?

嗯,没有好的答案.显然,如果您只需要"最终"而不是"在5秒内"发生关闭(或者如果您愿意在5秒后放弃干净关闭,并恢复使用特定于平台的API或守护线程),那么可以在每次阻塞调用之前和之后放置检查,它将"经常"工作.但如果这还不够好,你真的无能为力.

如果您需要这个,最好的答案是更改您的架构以使用具有此方法的框架.最流行的选择是Twisted,Tornadogevent.在未来,PEP 3156将为标准库带来类似的功能tulip,如果您不想为现实世界构建一些必须即将就绪的东西,那么有一个部分完整的参考实现值得一试.