2009-08-04 95 views
5

什么是推荐的方式来终止python中长时间运行的线程?我不能用SIGALRM,因为终止长时间运行的python线程

如果两个 信号和线程在同一 程序中使用的一些必须小心。 记得在使用信号和线程 同时是的基本事情是:始终执行 信号()操作在主线程 的执行。任何线程都可以执行警告(),getignal(),暂停(), setitimer()或getitimer(); 仅 主线程可以设置一个新的信号 处理程序,并在主线程将是 接收信号 (这是由Python信号 模块执行,即使底层线程 实现支持发送 唯一的一个发信号给个别线程)。这个 意味着信号不能用作线程间通信的手段 。请改用锁定。

更新:在我的情况下,每个线程块 - 它使用urllib2模块下载网页,有时操作需要太多的时间在一个非常缓慢的网站。这就是为什么我想要终止这种慢线程的原因

回答

6

由于突然杀死处于阻塞调用中的线程是不可行的,因此如果可能的话,更好的方法是避免使用线程来支持不受此类问题影响的其他多任务机制。

对于OP的特定情况(线程的工作是下载网页,并且一些线程由于行为不当而永久阻塞),理想的解决方案是twisted--因为它通常用于联网任务。在其他情况下,multiprocessing可能会更好。更一般地说,当线程给出无法解决的问题时,我建议切换到其他多任务机制,而不是尝试使线程执行至少在CPython中不适用的任务的英雄措施。

1

如果您试图杀死其代码无法控制的线程,则取决于该线程是否处于阻止呼叫。根据我的经验,如果线程正确阻塞,没有建议和便携的方式来做到这一点。

我试图用标准库中的代码(multiprocessing.manager我正在看着你)使用循环编码且没有退出条件时遇到了这个问题:很好!

这里有一些可执行的线程实现(see here for an example),但是如果你自己控制了线程代码,你应该能够以一种方式编写它们,你可以用一个条件变量某种。

1

使用同步对象并要求线程终止。基本上,写合作处理这个。

如果你开始抽出python解释器下面的线程,会发生各种奇怪的事情,而且这不仅仅是Python,大多数运行时都有这个问题。

例如,假设您在打开一个文件后终止一个线程,那么在该应用程序终止之前该文件将无法关闭。

+0

问题是,当你有一个方法需要很长时间(例如urllib.read(),在某些情况下它会忽略超时),你我想打断。 – kolinko 2013-09-12 15:08:09

+1

如果你在自己的线程上执行该读取,你不能简单地停止等待它吗?最终它会完成/失败/完成,然后它就死了? – 2013-09-13 06:05:07

5

正如Alex Martelli建议的那样,您可以使用多处理模块。它与线程模块非常相似,所以应该让你轻松入门。你的代码可能是这样的,例如:

import multiprocessing 

def get_page(*args, **kwargs): 
    # your web page downloading code goes here 

def start_get_page(timeout, *args, **kwargs): 
    p = multiprocessing.Process(target=get_page, args=args, kwargs=kwargs) 
    p.start() 
    p.join(timeout) 
    if p.is_alive(): 
     # stop the downloading 'thread' 
     p.terminate() 
     # and then do any post-error processing here 

if __name__ == "__main__": 
    start_get_page(timeout, *args, **kwargs) 

当然,你需要以某种方式获得您的主页下载代码的返回值。为此,您可以使用multiprocessing.Pipe或multiprocessing.Queue(或其他可用于多处理的方法)。有更多的信息,以及您可以在http://docs.python.org/library/multiprocessing.html检查的样本。

最后,多处理模块包含在python 2.6中。它也可用于在Python 2.5和2.4在PyPI中(可以使用

easy_install的多处理

或只需访问的PyPI和手动下载并安装软件包。

注意:我意识到这已经发布了一段时间。我遇到了类似的问题,在这里偶然发现了Alex Martelli的建议。如果它执行我的问题,并决定分享它。 (我想感谢Alex指着我朝着正确的方向。)

相关问题