线程 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 应用程序没有干净地关闭的主要内容,如果未能解决你的问题,请参考以下文章

在多线程 HTTP 服务器中发送后,如何干净地关闭套接字?

C# 退出程序方法

如何使用 Ctrl+C 输入干净地退出 QProcess?

c#多线程

C# WinForm程序中强制退出程序以及启动程序

C#程序退出的几种方法