如何通过阻塞函数调用停止线程?

时间:2014-03-10 19:47:27

标签: python python-multithreading

我在一个线程中使用psutil库,定期发布我的CPU使用情况统计信息。这是一个片段:

class InformationThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self)

    def run(self):    
        while True:
            cpu = psutil.cpu_percent(interval=600) #this is a blocking call
            print cpu

我需要停止这个帖子,但我似乎无法理解如何。方法cpu_percent是一个阻塞函数,将阻塞600秒。

我一直在挖掘,我看到的所有示例都依赖于一个紧密循环来检查一个标志,看看是否应该中断循环,但在这种情况下,我不确定如何杀死该线程。 / p>

2 个答案:

答案 0 :(得分:2)

将interval设置为0.0并实现更紧密的内循环,您可以在其中检查您的线程是否应该终止。计算时间并不困难,因此调用cpu_percent()之间经过的时间与600大致相同。

答案 1 :(得分:0)

您可以向stop()类添加InformationThread方法,以终止其run()循环,如下所示。但请注意,它不会取消阻止正在进行的cpu_percent()来电。

class InformationThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self)
        self.daemon = True  # OK for main to exit even if instance still running
        self.running = False
        self.status_lock = threading.Lock()

    def run(self):
        with self.status_lock:
            self.running = True
        while True:
            with self.status_lock:
                if not self.running:
                    break
            cpu = psutil.cpu_percent(interval=600)  # this is a blocking call
            print cpu

    def stop(self):
         with self.status_lock:
            self.running = False