3

我正在使用请求来提取一些文件。我注意到在从 5K 到 20K 的大量迭代之后,该程序似乎挂起。我可以说它挂了,因为存储结果的文件夹在几个小时内没有改变。我一直试图通过按 CTRL + C 来中断进程(我正在使用 IDLE),但无济于事。我想中断而不是终止进程,因为重新启动更容易。我终于不得不终止这个过程。我重新启动,它再次运行良好,直到我有相同的症状。我想弄清楚如何诊断问题,但由于我不得不杀死所有东西,所以我不知道从哪里开始。

是否有其他方法可以查看正在发生的事情或更有效地中断该过程?

我一直在假设,如果我可以在不杀戮的情况下中断,我可以查看全局变量,或者做一些其他的事情来弄清楚我的代码挂在哪里。

4

1 回答 1

1

万一还不算太晚:我刚刚遇到了同样的问题并有一些提示

第一件事:在 python 中,大多数等待的 api 是不可中断的(即 Thread.join()、Lock.acquire()...)。查看这些页面以获取更多信息: http ://snakesthatbite.blogspot.fr/2010/09/cpython-threading-interrupting.html http://docs.python.org/2/library/thread.html

那么如果一个线程正在等待这样的调用,它就不能被停止。还有一件事要知道:如果一个正常的线程正在运行(或挂起),主程序将无限期地停留,直到所有线程都停止或进程被终止。

为避免这种情况,您可以在调用 Thread.start() 之前使线程成为守护线程:Thread.daemon=True。

第二件事,要找到你的程序挂在哪里,你可以使用调试器启动它,但我更喜欢日志记录,因为日志总是在那里,以防调试迟到。

尝试在每次等待调用之前和之后记录,以查看您的线程已挂起多长时间。要获得高质量的日志,请使用配置了文件处理程序、html 处理程序甚至更好的 syslog 处理程序的 python 日志记录。

于 2013-05-09T16:08:28.370 回答