线程 python 应用程序没有干净地关闭
Posted
技术标签:
【中文标题】线程 python 应用程序没有干净地关闭【英文标题】:Threaded python application not closing cleanly 【发布时间】:2013-01-24 22:25:17 【问题描述】:我有一个用 Python 2.7 编写的small crawling application,它使用线程来获取大量 URL。但它不能干净地关闭或正确响应键盘中断,尽管我尝试通过我在这里找到的一些建议来解决后一个问题。
def main():
...
for i in range(NUMTHREADS):
worker = Thread(target=get_malware, args=(malq,dumpdir,))
worker.setDaemon(True)
worker.start()
...
malq.join()
if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
sys.exit()
我需要确保当我按 Ctrl-C 或完成运行时它会正确退出,而不是必须按 Ctrl-Z 并终止工作。
谢谢!
【问题讨论】:
有趣的是,我用 Python 2 和 Python 3 尝试过这个,发现 Python 3 没有出现这个问题。 没想到...我想知道我还需要做多少才能将其移植到 Python3。 类似:***.com/questions/1824418/… 【参考方案1】:关于GIL 如何影响具有多个 IO 绑定线程的 Python 应用程序的信号处理的讨论。显然 IO 绑定线程导致主线程因进程时间而饿死,并且无法按预期处理信号。我建议查看替代的parallel processing options(如subprocess 模块,或multiprocessing)或异步框架(如asyncoro)
【讨论】:
我曾考虑过切换到多处理,但不确定重量级进程会有多大帮助。出于某种原因,我的印象是这些对于 CPU 密集型应用程序更重要。这不正确吗? 发生这种情况是因为没有办法在 Python 中设置线程优先级(目前)。 IO 绑定线程等待 IO 事件。我记得这些问题对于具有多个 IO 绑定线程和 1 个(或更多)CPU 绑定线程的应用程序很常见。如果您想避免重量级进程,也可以使用异步解决方案。 (docs.python.org/2/library/asyncore.html) Eventlet 还可以让您避免重量级进程并实现异步,而无需更改太多您的代码。以上是关于线程 python 应用程序没有干净地关闭的主要内容,如果未能解决你的问题,请参考以下文章