如何停止一个带有阻塞函数调用的线程?

2024-04-27 12:58:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个线程中使用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

我需要停止这条线,但我似乎不明白怎么做。方法^{}是一个阻塞函数,它将阻塞600秒。在

我一直在研究,我看到的所有例子都依赖于一个紧密的循环,它检查了一个标志,以确定循环是否应该被中断,但是在这个例子中,我不确定如何终止线程。在


Tags: self信息initdefargscpu线程thread
2条回答

将interval设置为0.0并实现一个更紧密的内部循环,在这个循环中可以检查线程是否应该终止。计时应该不难,这样调用cpu_percent()之间的时间大致等于600。在

您可以将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

相关问题 更多 >