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

2 投票
1 回答
2619 浏览
提问于 2025-04-18 06:56

我现在在尝试使用 threading.Timer,但似乎进展不太顺利。我的目标是让数百个函数不断重复运行。问题是,我的内存使用量一直在增加,直到程序停止。

我的代码大概是这样的:

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 来终止线程,但对我来说,这样做并没有效果。

我想问的是:在这个代码示例中,我该如何正确终止线程?还有,怎样才能阻止脚本继续占用越来越多的内存?或者说我是不是做错了什么?

抱歉如果我问了一个已经被问过很多次的问题,但我搜索了很久还是找不到解决办法。

提前感谢大家的帮助。

1 个回答

0

像这样吗?在循环中设置一个结束条件就行了。最后的连接操作确保所有线程都完成后再继续进行。我经常和队列一起使用这个(你可以找一些示例,比如队列工作任务模式或者类似的搜索)。

另外,当我只需要定时运行某些任务或者实现类似定时任务的功能时,我会使用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()

撰写回答