杀死阻塞线程

时间:2016-08-18 14:59:36

标签: python-2.7 python-multithreading

我正在努力开发一个线程应用程序,其中每个线程都通过网络进行REST调用。

我需要在超时后杀死活动线程。我已经尝试了我在这里看到的每个python 2.7.x方法,并且无法实现这一点。

我在OEL linux上使用python 2.7.6(3.8.13-44.1.1.el6uek.x86_64)。

以下是一段简化的代码:

class cthread(threading.Thread):
    def __init__(self, cfg, host):
        self.cfg  = cfg
        self.host = host
        self.runf = False
        self.stop = threading.Event()
        threading.Thread.__init__(self. target=self.collect)

    def terminate(self):
        self.stop.set()

    def collect(self):
        try:
            self.runf = True
            while (not self.stop.wait(1)):
                # Here I do urllib2 GET request to a REST service which could hang
                <rest call>
         finally:
             self.runf = False

timer_t1 = 0

newthr = cthread(cfg, host)
newthr.start()

while True:
    if timer_t1 > 600:
        newthr.terminate()
        break
    time.sleep(30)
    timer_t1 += 30

基本上在我的超时时间之后,我需要优雅地或不是杀死所有剩余的线程。

没有时间让这个工作。

我是否以正确的方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

在python中没有官方API来杀死一个线程。

在依赖 urllib2 的代码中,您可能会定期传递剩余的超时时间,以便线程从主循环运行,并使用 urllib2 并使用 timeout 选项。或者甚至跟踪使用urllib2的相同方法的线程中的计时器。