无法阻止失败的线程

时间:2017-11-18 22:27:25

标签: python multithreading python-3.x python-multithreading

当出现问题时,我有一个问题就是停止线程。如果所有的运行都像计划(并且run()通过),我可以使用我的stop_thread()函数停止线程,但无论如何,它们几乎不会自动停止,我不知道为什么。

class sample_thread:

def __init__(self):
    self._running = True

def stop(self):
    self._running = False


def run():
    try:
        do something
    except:
        do something
        self._running = False
    finally:
        do something
        self._running = False

所以这是我的线程类。 我有最多2个线程(不包括主要)运行,并希望在一段时间后停止它们,如果它们没有完成。

def stop_thread(p):
print(time.time()-p['start'])
if time.time() - p['start'] > 240:
    try:
        p['thread_name'].stop()
        do something more
        p['thread_instance'].join(10)
        if p['thread_instance'].is_alive():
            print('[-] Thread should be dead, but is still alive. Try again later')
            p['thread_name'].stop()
            p['thread_instance'].join(10)
            return False
        else:
            print('[+] Failed thread successful stopped')
        return True
    except:
        print('[-] Error occured in stop_thread')

'p'是一个关于线程的一些信息的dict(开始时间,名称,实例等)。 所以我的问题基本上是,当出现意外情况并且代码进入if子句时,我无法再停止该线程。无论多久返回一次False并通过stop_thread函数。 任何想法我的代码有什么问题,或者我如何修复它并可靠地杀死我的线程? 我很乐意为你提供帮助! 提前谢谢

1 个答案:

答案 0 :(得分:0)

你无法从另一个Python线程中杀死Python线程。此外,如果你试图杀死与你相同的进程中的另一个Python线程,你最终可能会自杀。您只能请求线程停止通过您已设置的某个消息频道。

例如,您可以考虑将queue传递给线程:

class SampleThread():
    def __init__(self, q):
        self.q = q

    def run(self):
        while True:
           do_some_work()
           if not self.q.empty():
               return