Python - 如何正确终止threading.Timer类?

时间:2014-05-18 18:44:49

标签: python multithreading timer terminate

我正在尝试使用threading.Timer,不知怎的,我做得不好...... 我的目标是运行数百个函数,一直重复。 问题是,我的RAM的使用正在增长,并且不断增长和增长,直到流程停止。

这就是我的代码的样子:

from threading import Timer

class Foo:
    def __init__(self, number):
        self.number = number
        self.timer = Timer(1, self.print_number)
        self.timer.start()

    def print_number(self):
        print "Number: %s"%self.number
        self.repeat()

    def repeat(self):
        self.timer.cancel()
        #self.timer.join()
        #time.sleep(1)
        self.timer = Timer(3, self.print_number)
        self.timer.start()

for x in range(1, 300):
    Foo(x)

所以,我读过我可以在.cancel()之后使用.join()方法终止一个线程。 但是当我这样做时,我得到了RuntimeError: (cannot join current thread)。 在类似的主题上,我读过我可以在.cancel()之后使用time.sleep来终止一个线程, 但这对我来说没有任何帮助。

我的问题:如何在此代码示例中正确终止线程,如何阻止脚本使用越来越多的RAM,或者我是否做了非常错误的事情?

很抱歉,如果我重新询问已经多次询问过的问题,但我正在搜索并尝试了几个小时但尚未找到解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这样的东西?只是在循环中有一个休息条件。最后的连接只是确保所有线程在前进之前完成。我经常使用这个队列(你可以找到样本,队列工作任务模式或类似的搜索)。

或者,当我只需要在计时器或某些类似cron的功能上运行时,我会使用apscheduler。

import threading
import time

WORKERS = 300

class Worker(threading.Thread):

    def __init__(self, number):
        self.number = number
        threading.Thread.__init__(self)

    def run(self):
        while 1:
            if self.number > 300:
                break

            print "Number: %s"%self.number
            self.number += 1
            time.sleep(3)

workers = []
for i in range(WORKERS):
    w = Worker(100)
    workers.append(w)
    w.start()

for w in workers: 
    w.join()