在python中加入一个始终运行的线程

时间:2011-09-20 17:43:04

标签: python multithreading

如果这是一个愚蠢的问题,请原谅我;我是一个非常新的线程。 我正在运行一个线程,当我更改keeprunning状态时,它将完成:

class mem_mon(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.keeprunning = True
        self.maxmem = 0
    def run(self):
        while self.keeprunning:
            self.maxmem = max(self.maxmem, ck_mem())
            time.sleep(10)

但由于sleep电话,我经常需要等待一段时间才能加入。除了创建一个更频繁地检查keeprunning的更快的循环之外,我能做些什么来更快地加入线程吗?例如,通过覆盖__del__join

2 个答案:

答案 0 :(得分:3)

使用threading.Event作为time.sleep()可以中断。

class mem_mon(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.keeprunning = True
        self.maxmem = 0
        self.interrupt = threading.Event()

    def run(self):
        # this loop will run until you call set() on the interrupt
        while not self.interrupt.isSet():
            self.maxmem = max(self.maxmem, ck_mem())

            # this will either sleep for 10 seconds (for the timeout)
            # or it will be interrupted by the interrupt being set
            self.interrupt.wait(10)

mem = mem_mon()
mem.run()

# later, set the interrupt to both halt the 10-second sleep and end the loop
mem.interrupt.set()

答案 1 :(得分:0)

我能想到的最简单的解决方案也是最丑陋的 - 我曾经看过如何杀死Python中的任何线程,在这个方法中:http://icodesnip.com/snippet/python/timeout-for-nearly-any-callable - 我从来没有使用它,根据需要使用Locks和Queue,但是可能性就在那里。