查找python线程状态(无论是睡眠还是活动)

时间:2014-08-20 21:16:32

标签: python multithreading sleep

我有一个简单的要求,当一个事件发生时,一个线程被创建并在醒来之前休眠x分钟以执行其任务并终止。

但是如果发生另一个事件,任何正在休眠的线程都应该被终止,并且应该为同一目的产生一个新的线程。

在python中我认为让线程睡眠的最好方法是,

import time
time.sleep(x*60)

有没有办法学习线程的状态(当前正在休眠/空闲或活着)?

2 个答案:

答案 0 :(得分:2)

由于线程处于活动状态(正在运行)与否,因此实际上无法做到这一点。从技术上讲,即使它在睡觉它仍在运行/活着它只是没有做任何事情。

一般情况下,在线程中使用睡眠并不是理想的,因为调整睡眠时间和/或在需要它时可以将其唤醒可能会很痛苦。

我过去用过的一件事就是线程模块中的Condition。这允许你把一个线程放到" sleep"通过调用.wait()。然后你可以使用.acquire(false)查看它是否被阻止,然后.acquire()。notify()。release()如果你需要再次唤醒它。

它是一种简单的方法来保持一个线程和旋转或使用疯狂的睡眠范例。

另一个好的选择就是让线程在阻塞队列(python中的队列模块)中消耗一段时间,这将在技术上管理所有这些。

答案 1 :(得分:0)

如果您使用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秒。这段代码的作用是检查线程执行是否已达到某个执行点(在这种情况下是睡眠之后的行)。