Python中的Timer对象

时间:2015-03-04 13:58:47

标签: python multithreading timer

我对Python中的Timer对象有疑问: https://docs.python.org/2/library/threading.html#timer-objects

此对象基本上是一个在用户定义的秒数后调用特定函数的Thread。我的问题是:在函数调用之后,Thread对象会自动消除程序,或者这个对象是否继续运行,消耗内存?

这段代码显示了我在说什么:

from threading import Timer
from random import randint

def call_function(x):
    print "Timer number " + str(x) + " hit call function!"

for x in range(200000):
    #memory used: 700.000 K
    print "Creating timer number: " + str(x)
    Timer(randint(1, 10), call_function, [x]).start()

在200.000个线程之后,Timer创建并在10秒的空间内被调用(在此调用之后它们应该已经死了,释放空间,对吗?),程序以700.000 K的内存消耗结束它,几乎为1 GB 。

谢谢,

1 个答案:

答案 0 :(得分:2)

Timer只是一个Thread subclass(由名为Timer的工厂函数创建),运行方法简单:

class _Timer(Thread):
    def __init__(self, interval, function, args=[], kwargs={}):
        Thread.__init__(self)
        self.interval = interval
        self.function = function
        self.args = args
        self.kwargs = kwargs
        self.finished = Event()

    def cancel(self):
        self.finished.set()

    def run(self):
        self.finished.wait(self.interval)
        if not self.finished.is_set():
            self.function(*self.args, **self.kwargs)
        self.finished.set()

线程在run()方法终止后终止:

  

一旦线程的活动开始,就会考虑线程   '活'。当run()方法终止时它停止活动 -   通常,或通过提出未处理的例外。 is_alive()   方法测试线程是否存活。

计时器类对象本身应该自动进行垃圾收集,如果以后不再使用的话。

你不能启动200000个线程,它太多了(_Timer对象将被创建,但线程将无法启动)。请检查此问题:How many threads is too many?