查找Python线程状态(是否在睡眠或活动)

4 投票
2 回答
2749 浏览
提问于 2025-04-18 17:58

我有一个简单的需求,就是当发生某个事件时,程序会创建一个线程,然后让这个线程休眠x分钟,等到时间到了再醒来执行任务,然后结束。

但是如果在这个线程休眠的时候又发生了另一个事件,那么所有正在休眠的线程都应该被终止,并且要为同样的目的创建一个新的线程。

在Python中,我认为让线程休眠的最佳方法是:

import time
time.sleep(x*60)

有没有办法知道一个线程的状态(是正在休眠/闲置还是活着)?

2 个回答

4

其实,线程要么在运行,要么就不在运行,没有什么好的办法来处理这个问题。即使线程在“睡觉”,它实际上还是在运行,只是暂时不在做事情。

一般来说,在线程中使用“睡眠”并不是个好主意,因为调整它的睡眠时间或者在需要它做事情时叫醒它会很麻烦。

我过去用过的一种方法是使用线程模块中的条件(Condition)。这可以让你通过调用 .wait() 来让线程“睡觉”。然后你可以用 .acquire(false) 来检查它是否被阻塞,如果需要的话,可以用 .acquire()、.notify() 和 .release() 来把它叫醒。

这是一种简单的方法,可以让线程保持在那儿,而不是让它不停地转圈或者用一些复杂的睡眠方式。

另一个不错的选择是让线程在一个无限循环中从一个阻塞队列(Python中的Queue模块)中获取数据,这样技术上来说,所有的管理工作都由这个队列来处理。

2

如果你在使用类似 time.sleep 的东西,你可以设置一个变量为 False,然后在线程“醒来”后把它改成 True

class MyThread(Thread):

    def __init__(self):
        self.awake = False

    def run(self):
        time.sleep(x*60)
        self.awake = True

    def is_sleeping(self):
        return not self.awake() and self.isAlive()  # You need to know also if you already started the thread

然后你可以:

if (some_thread.is_sleeping()):
    # more code here.

注意:正如 Luke Wahlmeier 指出的,当你调用 thread.start() 时,线程就开始运行了。如果它碰到像 time.sleep(10) 这样的代码,它仍然在运行,只不过现在是在倒计时10秒。这段代码的作用是检查线程的执行是否到达某个特定的执行点(在这个例子中就是睡眠之后的那一行)。

撰写回答